Python/Numpy

9. python numpy 메소드

frcn 2019. 10. 3. 11:29
반응형

numpy는 numeric python의 약자로 파이썬의 연산을 빠르게 해주는 패키지이다.

 

numpy의 메소드들이 엄청 많아서 모든것을 외울 수는 없다.

 

없으면 찾아서 적용하면 됨! 

 

그래도 최소한 이런 것들이 있다는 것은 알아야 찾아볼 수 있을 것...

 

기본적으로 numpy는 C를 기반으로 연산하기 때문에, 파이썬의 계산보다 훨씬 빠르다.

 

따라서 numpy의 메소드에 for문을 사용하는 건 절대 하지말아야 할 일.

 

 

1. Array만들기

 

numpy dynamic typing을 지원하지 않음.

 

여러가지 형의 데이터를 넣을 수 없다.

 

숫자만 쓰도록 하자.

 

#Rank 1 Array(1차원)

#Rank 2 Array(2차원)

#3차원은 tensor

import numpy as np

#1차원
x=np.array([1,3,5], np.float64)
x	#1., 3., 5.

x[0]=5.2
x 	#5.2, 3., 5.

x.dtype	#float64

x.shape	#(3,) 튜플형으로 표현됨

#2차원
y=np.array([[1,2,3],[4,5,6]])



2. x.ndim / x.size / x.reshape / x.flatten

import numpy as np

y=np.array([[1,2,3],[4,5,6]])

#dim : dimension의 개수
y.ndim 	#2 

#size : 전체 데이터의 개수
y.size #6

#reshape : 재배열
y.reshape(2,3,1) 

#2차원 3x1로 변경됨
"""
[[[1],
[2],
[3]],

[[4],
[5],
[6]]]
"""

#-1을 넣으면 나머지를 계산해서 알아서 배정. 3x2로 변경됨
y.reshape(-1,2)


#flatten (다차원을 1차원으로 변경해줌)
y.flatten() #[1 2 3 4 5 6]



3. 인덱싱, 슬라이싱

import numpy as np

a=np.array([[1,2,3],[4,5,6],[7,8,9]], int)

a[0][1] #2

a[0,1] #2 -> [ , ] 를 사용하여 쉽게 불러올수 있다

a[:,2:] #전체 행, 2열 이상

# [[3]
# [6]
# [9]]

 

 

4. arrange() / zeros(shape, dtype) / ones(shape, dtype) / eye() / axis

import numpy as np

#arange는 range()와 똑같은 방식으로 사용
b = np.arange(10)
#[0 1 2 3 4 5 6 7 8 9]


#0으로 꽉찬 행렬
a=np.zeros(shape=(10,),dtype=np.int8) 
#1x10행렬 [0 0 0 0 0 0 0 0 0 0]


#1로 꽉찬 행렬
b=np.ones(shape=(3,2),dtype=np.int8)


#단위행렬
c=np.eye(3,3) #3x3 단위행렬


#랜덤변수
d=np.random.random((3,3))
print(d)


#축 axis (기준이 되는 dimension 축)
e=np.arange(1,13).reshape(3,4)
#1 2 3 4
#5 6 7 8
#9 10 11 12


e.sum(axis=0)
#[15 18 21 24] 각 열들의 합

e.sum(axis=1)
#[10 26 42] 각 행들의 합

e.mean(axis=1) 
#각 행들의 평균

e.std(axis=1) 
#각 행들의 표준편차

 

 

5. concatenate

import numpy as np

f=np.array([[1,2,3]])
g=np.array([[4,5,6]])

#두 행렬을 붙임(concatenate)
#axis=0이면 상하 결합

np.concatenate((f,g),axis=0)
# [[1 2 3]
# [4 5 6]]

##################################

f=np.array([[1,2],[3,4]])
g=np.array([[4],[5]])

#axis=1이면 좌우 결합

np.concatenate((f,g), axis=1)
# [[1, 2, 4],
# [3, 4, 5]]

 


6. 행렬 연산(사칙연산, broadcasting)

import numpy as np

g=np.array([[1,2],[3,4]])
h=np.array([[5,6],[7,8]])

g+h
#[[ 6, 8],
# [10, 12]]

g-h
# [[-4, -4],
# [-4, -4]]

g*h
#[[ 5, 12],
# [21, 32]]

g/h
# [[0.2 , 0.33333333],
#[0.42857143, 0.5 ]]

#행렬식 곱하기
g.dot(h)
np.dot(g,h)
#[[19, 22],
# [43, 50]]

#전치행렬
g.T

#broadcasting (다른 배열간 연산을 지원. matrix+scalar도 가능함)
#덧셈, 뺄셈, 곱셈, 나눗셈, 제곱, 몫만 구하기, 나머지만 구하기 모두 가능
g+3
#[[4, 5],
# [6, 7]]

#심지어 4x3행렬과 1x3행렬도 더할 수 있음 (1x3을 4x3으로 늘려서 자체 계산)

 


7. all() / any() / where() / argmax(), argmin()

import numpy as np

#All or Any
a=np.arange(10)

np.any(a>5) #True
np.any(a<0) #False
np.all(a>5) #False
np.all(a<0) #True


#where
a=np.array([1,3,0])

np.where(a>0,3,2) #(조건, T일때 리턴값, F일때 리턴값)
#[3, 3, 2]

np.where(a>0)
#[0, 1] 인덱스 값을 반환


#argmax, argmin 최대값, 최소값이 있는 인덱스번호를 리턴
a=np.array([1,2,5,8,33,22,57])

np.argmax(a) #6
np.argmin(a) #0


#axis를 사용하면 행이나 열을 기준으로 최대, 최소값의 인덱스번호를 찾을 수 있음
b=np.array([[1,2,5],[10,3,8]])

np.argmax(b,axis=1)
#[2, 0] 행으로 봤을 때 최대값의 인덱스번호.



8. boolean index / fancy index / tile()

import numpy as np

#boolean index
c=np.array([1,4,7,2,5,8,9])

c>3
#[False, True, True, False, True, True, True]

c[c>3]
#[4, 7, 5, 8, 9] 조건에 맞는 값들만 반환



#fancy index - b의 값들을 인덱스값으로 사용해서 a에서 값을 추출
a=np.array([2,4,6,8],float)
b=np.array([0,0,1,3,2,1],int) #반드시 int

a.take(b)
#[2., 2., 4., 8., 6., 4.] 



#Tile
i=np.array([1,2,3])

#1줄로 3번 반복
j=np.tile(i,(1,3))
#[1,2,3,1,2,3,1,2,3]

#2줄로 2번반복
k=np.tile(i,(2,2))
#[[1,2,3,1,2,3],
# [1,2,3,1,2,3]]

 

##기타

np.ones()
np.arange()
np.delete(ndarray, elements, axis)
np.append(ndarray, elements, axis)
np.insert(ndarray, index, elements, axis) -> index앞에 삽입
np.vstack(수직)
np.hstack(좌우)
np.copy(ndarray) (하드카피)
np.diag(ndarray, k=N) (대각선 추출)
np.unique(ndarray) (하나씩)
np.sort(ndarray)
np.sqrt(x) (루트)
np.exp(x)
np.power(x,2) (제곱)
x=np.array()
x[x>10] (boolean도 가능)
x.mean() / x.mean(axis=0)
x.sum() / x.sum(axis=0)
x.std() / x.std(axis=0) (표준편차)
np.median(x) / np.median(x, axis=0)
x.max() / x.max(x, axis=0)
x.min() / x.min(x, axis=0)

반응형