9. python numpy 메소드
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)