맞춤형 플랫폼 개발 도전기 (웹개발, 딥러닝, 블록체인)

Python Numpy Basic 2 (Dimension) 본문

딥러닝·머신러닝/Python

Python Numpy Basic 2 (Dimension)

경이가 꿈꾸는 플랫폼 개발 2021. 10. 31. 02:07

차원 변경

 

 

1. 1차원으로 변경

ravel() : 다차원배열을 1차원으로 변경 (흔히 '펼친다'라고 말함) → iterable.ravel() or np.ravel(iterable)

          order 파라미터 : 행 기준(C), 열 기준(F)

x = np.arange(15).reshape(3, 5)
np.ravel(x, order='C')  # '행' 기준으로 펼친다
np.ravel(x, order='F')  # '열' 기준으로 펼친다

# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
# array([ 0,  5, 10,  1,  6, 11,  2,  7, 12,  3,  8, 13,  4,  9, 14])

flatten() 과 차이점 : iterable.flatten() 할 경우에는 사본이 만들어지는 것이라서 원본이 변하지 않는다

                          iterable.ravel() 하면 원본까지 바뀐다

 

 

2. 차원 자동 제거

squeeze() : 차원(axis) 중, size가 1 인것을 찾아 스칼라 값으로 바꿔 해당차원을 제거

x = np.arange(4).reshape(2, 1, 2)
x.squeeze()

# array([[0, 1],
#        [2, 3]])

np.expand_dims(iterable, index) : 0번째 axis(인덱스) 에 새로운 차원 삽입

보통 차원 추가는 맨 앞(0), 맨 뒤(-1)에 추가하는 경우가 많음

x = np.arange(4).reshape(2, 2)
y = np.expand_dims(x, 1)
y.reshape(2,1,2)
y.shape
y.squeeze()

# x (2, 2) -->  y (2, 1, 2)

np.newaxis

a = np.array([2, 0, 1, 8])  # 1차원 벡터
a1 = a[np.newaxis, :]  # (1, 4)
a2 = a[:, np.newaxis]  # (4, 1)

 

3. 차원 축 바꾸기

 

np.transpose(iterable, 차원) == iterable.T (바꿀 축(차원)까지 지정해줄 수 있음)

np.swapaxis(iterable, 축번호, 축번호)

a = np.arange(20).reshape(4,5)
a.T 	# np.transpose(a), np.swapaxes(a, 0, 1)와 동일

# array([[ 0,  5, 10, 15],
#       [ 1,  6, 11, 16],
#       [ 2,  7, 12, 17],
#       [ 3,  8, 13, 18],
#       [ 4,  9, 14, 19]])

b = np.arange(24).reshape(2, 3, 4)
b.T

# array([[[ 0, 12],
#        [ 4, 16],
#        [ 8, 20]],
#
#       [[ 1, 13],
#        [ 5, 17],
#        [ 9, 21]],
#
#       [[ 2, 14],
#        [ 6, 18],
#        [10, 22]],
#
#       [[ 3, 15],
#        [ 7, 19],
#        [11, 23]]])

np.transpose(b, (2, 1, 0))

# array([[[ 0, 12],
#         [ 4, 16],
#         [ 8, 20]],
# 
#        [[ 1, 13],
#         [ 5, 17],
#         [ 9, 21]],
# 
#        [[ 2, 14],
#         [ 6, 18],
#         [10, 22]],
# 
#        [[ 3, 15],
#         [ 7, 19],
#         [11, 23]]])

 

4. 차원에 따른 연산 차이

np.sum( iterable , axis=0 ) 

axis 는 복수개로 줄 수도 있음

axis = 0 이다 → 차원 ( x, y ) 에서 axis = 0에 해당하는 x 를 삭제한다고 생각하면 편함 (연산을 x만큼 시킨다 생각)

그럼 결과는 y개로 이루어진 1차원 배열이 남게 되는 것

x = np.arange(24).reshape(3, 4, 2)
np.sum(x, axis=0)

# array([[ 0,  1,  2,  3,  4],
#        [ 5,  6,  7,  8,  9],
#        [10, 11, 12, 13, 14]]) 에서
# 아래와 같이 뽑아내는 것 (3,5) 에서 3을 없애버린 것
# array([15, 18, 21, 24, 27])

np.sum(x, axis=(1, 2))

# 1, 2열에 있던 4, 2 없어지고 3만 남음
# array([ 28,  92, 156])
Comments