[Python] numpy

2 minute read

numpy의 유용한 메소드

np.ones
np.ones(5) #output: [1.0,1.0,1.0,1.0,1.0]
reshape 메소드

배열과 차원을 변형해주는 함수이다. np.reshape(변경할 배열, 차원) or 배열.reshape(차원)으로 사용할 수 있다.

df['final'].values.reshape(-1,1).shape #output : (5,1)
df['final'].shape #output : (5,)

df['final'].values
df['final'].values.reshape(-1,1)

#output
array([ 2,  8, 14, 20, 26])

#output
array([[ 2],
       [ 8],
       [14],
       [20],
       [26]])

reshape을 활용하다 보면 입력인수로 -1이 입력되는 것을 볼 수 있다. -1의 의미는 변경된 배열의 -1의 위치의 차원은 ‘원래 배열의 길이와 다른 입력 인수로부터 결정된다.

다음의 코드를 보고 이해를 해보자.

a = np.arange(12) 
#output : array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

a.reshape(3,4)
#output : 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

a.reshape(3,-1)
#output : 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

a.reshape(-1,2)
#output :
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

a.reshape(-1)
#output : array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
행렬곱 dot & matmul
>>> import numpy as np
>>> A = np.arange(2*3*4).reshape((2,3,4))
>>> B = np.arange(2*3*4).reshape((2,4,3))
>>> np.dot(A,B).shape
(2, 3, 2, 3)
>>> np.matmul(A,B).shape
(2, 3, 3)

numpy.dot은 두 배열의 내적곱 numpy.matmul은 두 배열의 행렬곱이라고 하는데, 현재는 이 정도로만 알고 넘어가자.

좀 더 자세한 내용에 대해서는 여기를 참조하면 될 것 같다.

tensor?

matrix와 tensor의 차이를 가볍게 짚고 넘어가보자.

matrix란, 2차원 구조(행과 열)를 갖는 것을 가리키고 tensor란 행렬을 일반화한 것(즉, 3차원/4차원 등으로 확장한 것)을 말한다.

그래서 행렬곱은 두 행렬을 곱하는 것이고 두 텐서를 곱하는 것을 텐서곱이라고 한다.

np.cov & np.corrcoef
# 공분산
np.cov(v, w)
#output: 대각선의 값은 각 feature의 분산이고, 그 외의 값이 공분산 값이 된다.
        v      w
v  1363.7   71.7
w    71.7  149.7

# 상관계수
np.corrcoef(v, w)
#output: [0,1] 해당 인덱스가 두 feature의 상관 계수가 된다.
         v        w
v  1.00000  0.15869
w  0.15869  1.00000
np.concatenate() & np.stack
a = np.array([[1,2],[2,3]]) #a.shape (2,2)
b = np.array([[3,4]]) #b.shape (1,2)

#concatenate는 합칠 axis의 shape값을 제외하고 나머지 shape 값이 일치하면 두 벡터 값 혹은 행렬 값을 합칠 수 있다.
np.concatenate((a,b),axis=0) #np.concatenate((a,b),axis=0).shape (3,2)
#output : 
array([[1, 2],
       [3, 4],
       [5, 6]])

a = np.array([[1, 2], [3, 4]]) # a.shape=(2, 2)
b = np.array([[5, 6], [7, 8]]) # b.shape=(2, 2)

np.stack((a,b)) #np.stack((a,b)).shape (2,2,2)
#output : 
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])
np.linalg.matrix_rank(array)
array의 rank를 반환해준다.
np.random

np.random.binomial()

0 또는 1의 값이 p(확률) 옵션에 따라 size 옵션에 지정된 수만큼을 가진 배열을 생성한다.

np.random.binomial(n = 1, p = 0.5, size = 100)
#output:
array([1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
       0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,
       0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1,
       0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0,
       0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0])

np.random.randint()

0 ~ 100 사이에 20 개의 정수를 추출해 배열로 생성한다.

np.random.randint(0,100,20)
#output:
array([84, 57, 46, 98, 18,  9, 98, 84,  1, 48, 74, 15, 54, 29, 22,  6, 72,66, 32, 79])