본문 바로가기
Studying/Machine Learning

[머신러닝] 파이썬 Numpy - Numpy의 유용한 기능들

by giem 2022. 6. 23.
반응형

2022.06.21 - [Studying/Machine Learning] - [머신러닝] 파이썬 Numpy - Numpy indexing과 slicing

 

[머신러닝] 파이썬 Numpy - Numpy indexing과 slicing

2022.06.20 - [Studying/Machine Learning] - [머신러닝] 파이썬 Numpy - Numpy 모듈의 수학적 기능들 [머신러닝] 파이썬 Numpy - Numpy 모듈의 수학적 기능들 저번 Numpy 포스팅에 이어서 2022.06.15 - [Studying..

gm-note.tistory.com

저번 포스팅에 이어 Python numpy의 유용한 기능들을 정리해보려고 한다.

 

이 포스팅에서 정리할 기능들은 매우 자주 쓰이므로 익숙해지는 것이 좋다.

 


Reshape

 

Numpy의 reshape은 Numpy의 가장 중요한 기능 중 하나로,

numpy 배열의 shape를 전달하는 파라미터 처럼 바꿔준다.

 

주의할 점은 바뀐 후 array의 size가 해당 array의 기존 size와 일치해야 한다.

일반적으로 실수를 방지하기 위해 numpy에서 제공하는 기능인 -1로

남은 dimension의 size를 자동으로 결정해준다. (3번째 예시)

x = np.arange(5, 101, 5)
print((x, x.shape))

# (array([  5,  10,  15,  20,  25,  30,  35,  40,  45,  50,  55,  60,  65,
#         70,  75,  80,  85,  90,  95, 100]),
#  (20,))

a = x.reshape(2, 2, 5)
print((a, a.shape))
# (array([[[  5,  10,  15,  20,  25],
#         [ 30,  35,  40,  45,  50]],

#        [[ 55,  60,  65,  70,  75],
#         [ 80,  85,  90,  95, 100]]]),
#  (2, 2, 5))

b = x.reshape(-1, 5)
print((b, b.shape))
# (array([[  5,  10,  15,  20,  25],
#        [ 30,  35,  40,  45,  50],
#        [ 55,  60,  65,  70,  75],
#        [ 80,  85,  90,  95, 100]]),
#  (4, 5))

 

Flatten

flatten은 ndarray를 1차원으로 바꿔준다.

a = x.reshape(2, 2, 5)
print(a)
# (array([[[  5,  10,  15,  20,  25],
#          [ 30,  35,  40,  45,  50]],
#         [[ 55,  60,  65,  70,  75],
#          [ 80,  85,  90,  95, 100]]]),

print(a.flatten())
#  array([  5,  10,  15,  20,  25,  30,  35,  40,  45,  50,  55,  60,  65,
#          70,  75,  80,  85,  90,  95, 100])

 

Item

item은 flatten 시켰을 때 해당 index의 원소를 반환한다. (index 기능)

print(a.item(2))
#15
print(a.item(10))
#55

 


Broadcasting

 

Numpy의 broadcasting은 numpy에서 제공하는 매우 유용한 기능 중 하나이다.

 

다른 size의 array들 끼리 arithmetic operations를 할 때 사용된다.

 

연산을 할 때 broadcasting은 매우 유용하나, 자동으로 형태를 맞춰서 계산 해주기 때문에

의도와 다르게 적용되고 있는 것이 아닌지 항상 조심해서 사용을 해야한다.

 

Numpy 사용 시, 큰 array와 작은 array끼리 연산하는 경우가 많은데

작은 array를 큰 array에 여러 번 적용하여 연산할 때 broadcasting이 사용된다.

 

두 numpy 배열 a와 b에 대해 연산을 할 때 a와 b가 compatible하다면

두 배열의 size가 다른 경우에도 broadcasting을 통해 연산이 가능하다.

 

a와 b의 shape의 rightmost element부터 비교 했을 때

아래 두가지 조건 중 하나를 만족한다면, a와 b는 compatible하다고 한다.

1) shape이 같은 경우

2) 둘 중 하나가 1인 경우

 

그러면 예제를 통해 보겠다.

 

x = np.array([[1,2], [3,4]])
y = np.array([10, 20])
print(x + y)
# array([[11, 22],
#        [13, 24]])

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

#        [[12, 13, 14, 15],
#         [16, 17, 18, 19],
#         [20, 21, 22, 23]]])

b = np.array([1,2,3]).reshape(3,1)
print(b)
# array([[1],
#        [2],
#        [3]])

print(a+b)
# array([[[ 1,  2,  3,  4],
#         [ 6,  7,  8,  9],
#         [11, 12, 13, 14]],

#        [[13, 14, 15, 16],
#         [18, 19, 20, 21],
#         [23, 24, 25, 26]]])

첫 번째 경우 x의 shape은 (2,2) y는 (2,)다.
이 경우 x의 shape은 (2,2), y는 (1,2)로 생각을 하고 가장 오른쪽 dimension shape부터 비교를 한다
가장 오른쪽 dimension shape의 경우, x와 y 둘 다 2로 같다.


다음으로는 x는 2, y는 1이 되는데 이 경우 y가 1이므로 broadcasting rule을 만족한다.
그래서 ([1,2], [3,4]) + ([10, 20], [10, 20])으로 연산이 된다.

 

조금 더 단순한 예제는 다음과 같다.

x = np.arange(1, 10).reshape(1, -1)
y = np.full((9, 1), 10)

print((x, x.shape))
print((y, y.shape))
print(x * y)

# (array([[1, 2, 3, 4, 5, 6, 7, 8, 9]]), (1, 9))

# (array([[10],
#        [10],
#        [10],
#        [10],
#        [10],
#        [10],
#        [10],
#        [10],
#        [10]]),
#  (9, 1))

# array([[10, 20, 30, 40, 50, 60, 70, 80, 90],
#        [10, 20, 30, 40, 50, 60, 70, 80, 90],
#        [10, 20, 30, 40, 50, 60, 70, 80, 90],
#        [10, 20, 30, 40, 50, 60, 70, 80, 90],
#        [10, 20, 30, 40, 50, 60, 70, 80, 90],
#        [10, 20, 30, 40, 50, 60, 70, 80, 90],
#        [10, 20, 30, 40, 50, 60, 70, 80, 90],
#        [10, 20, 30, 40, 50, 60, 70, 80, 90],
#        [10, 20, 30, 40, 50, 60, 70, 80, 90]])

 


여기까지 Numpy에서 자주 쓰이는 함수에 대해서 정리해 보았다.

reshape, flatten, broadcasting부분은 실제로 머신러닝 데이터 전처리에 많이 쓰이니 익숙해지는게 좋다고 생각한다.

 

다음 포스팅에서는 마지막으로 Numpy모듈의 Ndarray 행렬의 연산을 알아보려고 한다.

 

원래는 이번 포스트와 같이 포스팅 하려고 했는데

Neural Network에서 실질적으로 쓰이는 부분이고 중요도가 있어서 따로 정리하려고 한다.

반응형

댓글