상세 컨텐츠

본문 제목

NUMPY 기초 문법 정리4_배열 변환

PYTHON/NUMPY

by mk coding 2024. 1. 19. 20:56

본문

배열 전치 및 축 변경

  • 두 축이 교환된 전치 행렬을 반환받을 수 있는 3가지 형태
    • np.transpose(배열)
    • 배열.transpose
    • 배열.T

코드 

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

# 아래 3가지 모두 같은 결과 반환
print("np.transpose \n", np.transpose(x))
print("\nx.transpose \n", x.transpose())
print("\nx.T \n", x.T)

 

결과

더보기
np.transpose 
 [[1 4]
 [2 5]
 [3 6]]

x.transpose 
 [[1 4]
 [2 5]
 [3 6]]

x.T 
 [[1 4]
 [2 5]
 [3 6]]

3차원 배열 기준 transpose(배열, (0, 1, 2))

여기서

0은 차원 사이의 인덱스 위치

1은 차원 안에서 세로축

2는 차원 안에서 가로축

 

예) 
[[[ 1, 2, 3],
  [ 4, 5, 6],
  [ 7, 8, 9]], 
 [[ -1, -2, -3],
  [ -4, -5, -6],
  [ -7, -8, -9]]] 
라면, 
5와 -5는 axis 0 
1, 4, 7은 axis 1
-1, -2, -3은 axis 2

2와 -2는 axis 0
-3, -6, -9는 axis 1
4, 5, 6은 axis 2

transpose함수의 축 파라미터 위치는 0, 1, 2의 순서이다. 즉, transpose함수의 파라미터를 0, 2, 1로 설정한다면, 1번 자리에 axis 2가 왔고, 2번 자리에 axis 1이 왔으므로 axis 2와 axis 1의 위치가 바뀌게 된다. 

 

만약 3차원 이상의 배열에 대하여 transpose의 축 순서 튜플을 지정하지 않는다면 default로 전체 axis방향이 reverse된 결과가 축 순서 튜플로 간주되어 축 교환이 수행된다. 

  • 변경할 두 축의 위치를 직접 지정하여 축 교환을 진행할 수도 있음. 
  • 세 축을 모두 지정할 수 있는 transpose와는 달리 두 개의 축만 지정할 수 있다. 
    • np.swapaxes(배열, 축1, 축2)
    • 배열.swapaxes(축1, 축2)

코드

print("a2배열 \n", a2)
print("\na2.T \n", a2.T)
print("\na2.swapaxes(1, 0) \n", a2.swapaxes(1, 0))
print("-"*60)

print("a3배열 \n", a3)
print("\na3.T \n", a3.T)
print("\na3.swapaxes(2, 0) \n", a3.swapaxes(2,0))
print("\na3.swapaxes(2, 1) \n", a3.swapaxes(2,1))

 

더보기
a2배열 
 [[1 2 3]
 [4 5 6]
 [7 8 9]]

a2.T 
 [[1 4 7]
 [2 5 8]
 [3 6 9]]

a2.swapaxes(1, 0) 
 [[1 4 7]
 [2 5 8]
 [3 6 9]]
------------------------------------------------------------
a3배열 
 [[[ 1  2  3]
  [ 4  5  6]
  [ 7  8  9]]

 [[10 11 12]
  [13 14 15]
  [16 17 18]]

 [[19 20 21]
  [22 23 24]
  [25 26 27]]]

a3.T 
 [[[ 1 10 19]
  [ 4 13 22]
  [ 7 16 25]]

 [[ 2 11 20]
  [ 5 14 23]
  [ 8 17 26]]

 [[ 3 12 21]
  [ 6 15 24]
  [ 9 18 27]]]

a3.swapaxes(2, 0) 
 [[[ 1 10 19]
  [ 4 13 22]
  [ 7 16 25]]

 [[ 2 11 20]
  [ 5 14 23]
  [ 8 17 26]]

 [[ 3 12 21]
  [ 6 15 24]
  [ 9 18 27]]]

a3.swapaxes(2, 1) 
 [[[ 1  4  7]
  [ 2  5  8]
  [ 3  6  9]]

 [[10 13 16]
  [11 14 17]
  [12 15 18]]

 [[19 22 25]
  [20 23 26]
  [21 24 27]]]

배열 재구조화

  • reshape() : 배열의 형상을 변경
  • newaxis() : 새로운 축 추가

코드

n1 = np.arange(1, 10)
print("n1\n", n1)
print("\nn1.reshape(3,3)\n", n1.reshape(3,3)) # reshape(): 배열의 형상을 변경
print("\n\nn1[np.newaxis, :5]\n", n1[np.newaxis, :5]) # newaxis(): 새로운 축 추가 
print("\nn1[:5, np.newaxis]\n", n1[:5, np.newaxis])

 

더보기
n1
 [1 2 3 4 5 6 7 8 9]

n1.reshape(3,3)
 [[1 2 3]
 [4 5 6]
 [7 8 9]]


n1[np.newaxis, :5]
 [[1 2 3 4 5]]

n1[:5, np.newaxis]
 [[1]
 [2]
 [3]
 [4]
 [5]]

배열 크기 변경

  • resize -> 배열의 크기를 변경해주는 함수 
    • 배열 모양만 변경 -> 기존 요소들의 갯수에 맞추고 행과 열, 차원을 변경한 경우 
    • 배열 크기 증가 ( 남은 공간은 0으로 채워짐 ) -> 기존 요소들 갯수보다 배열 크기를 크게 설정한 경우  
    • 배열 크기 감소 ( 포함되지 않은 값은 삭제됨 ) -> 기존 요소들 갯수보다 배열 크기를 작게 설정한 경우 

코드

n2 = np.random.randint(0, 10, (2, 5))
print("기존 배열\n", n2)
n2.resize((5, 2))
print("\nn2.resize((5, 2))\n", n2)

n2.resize((5, 5))
print("\nn2.resize((5, 5))\n", n2)

n2.resize((3, 3))
print("\nn2.resize((3, 3))\n", n2)

 

결과

더보기
기존 배열
 [[1 0 0 4 8]
 [2 4 5 4 6]]

n2.resize((5, 2))
 [[1 0]
 [0 4]
 [8 2]
 [4 5]
 [4 6]]

n2.resize((5, 5))
 [[1 0 0 4 8]
 [2 4 5 4 6]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]

n2.resize((3, 3))
 [[1 0 0]
 [4 8 2]
 [4 5 4]]

배열 추가

  • append() : 배열의 끝에 값 추가
  • axis 지정이 없으면 1차원 배열 형태로 변형되어 결합
  • axis를 0으로 지정
    • shape[0]을 제외한 나머지 shape은 같아야 함
  • axis를 1로 지정
    • shape[1]을 제외한 나머지 shape은 같아야 함

코드

a2 = np.arange(1, 10).reshape(3, 3)
b2 = np.arange(10, 19).reshape(3, 3)
print("a2배열\n", a2)
print("\nb2배열\n", b2)

c2 = np.append(a2, b2)
print("\nmaxis지정하지 않고 append\n", c2)

c2 = np.append(a2, b2, axis = 0)
print("\naxis = 0 append\n", c2)

c2 = np.append(a2, b2, axis = 1)
print("\naxis = 1 append\n", c2)

 

결과

더보기
a2배열
 [[1 2 3]
 [4 5 6]
 [7 8 9]]

b2배열
 [[10 11 12]
 [13 14 15]
 [16 17 18]]

maxis지정하지 않고 append
 [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18]

axis = 0 append
 [[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]
 [13 14 15]
 [16 17 18]]

axis = 1 append
 [[ 1  2  3 10 11 12]
 [ 4  5  6 13 14 15]
 [ 7  8  9 16 17 18]]

배열 연결

  • concatenate() : 튜플이나 배열의 리스트를 인수로 사용해 배열 연결

코드

a1 = np.array([1, 3, 5])
b1 = np.array([2, 4, 6])
print("a1과 b1연결(concatenate)\n", np.concatenate([a1, b1]))

c1 = np.array([7, 8, 9])
print("\na1, b1, c1 연결(concatenate)\n", np.concatenate([a1, b1, c1]))

a2 = np.array([[1, 2, 3],
               [4, 5, 6]])
print("\na2, a2연결(concatenate) axis = 0 (default)\n", np.concatenate([a2, a2]))
print("\na2, a2연결(concatenate) axis = 1\n", np.concatenate([a2, a2], axis=1))

 

결과

더보기
a1과 b1연결(concatenate)
 [1 3 5 2 4 6]

a1, b1, c1 연결(concatenate)
 [1 3 5 2 4 6 7 8 9]

a2, a2연결(concatenate) axis = 0 (default)
 [[1 2 3]
 [4 5 6]
 [1 2 3]
 [4 5 6]]

a2, a2연결(concatenate) axis = 1
 [[1 2 3 1 2 3]
 [4 5 6 4 5 6]]
  • vstack() : 수직 스택(vertical stack), 1차원으로 연결
  • hstack() : 수평 스택(horizontal stack), 2차원으로 연결
  • dstack() : 깊이 스택(depth stack), 3차원으로 연결
  • stack() : 새로운 차원으로 연결

코드

a2 = np.array([[1,2,3],
              [4,5,6]])
print("a2\n", a2)
print("\nvstack\n", np.vstack([a2, a2]))
print("\nhstack\n", np.hstack([a2, a2]))
print("\ndstack\n", np.dstack([a2, a2]))
print("\nstack\n", np.stack([a2, a2]))

 

결과

더보기
a2
 [[1 2 3]
 [4 5 6]]

vstack
 [[1 2 3]
 [4 5 6]
 [1 2 3]
 [4 5 6]]

hstack
 [[1 2 3 1 2 3]
 [4 5 6 4 5 6]]

dstack
 [[[1 1]
  [2 2]
  [3 3]]

 [[4 4]
  [5 5]
  [6 6]]]

stack
 [[[1 2 3]
  [4 5 6]]

 [[1 2 3]
  [4 5 6]]]

배열 분할

  • split() : 배열 분할
  • vsplit() : 수직 분할, 1차원으로 분할
  • hsplit() : 수평 분할, 2차원으로 분할
  • dsplit() : 깊이 분할, 3차원으로 분할

코드

a2 = np.arange(1, 10).reshape(3, 3)
print("a2배열\n", a2)
print("-"*60)

b2, c2 = np.vsplit(a2, [2])
print("\nvsplit b2배열\n", b2)
print("\nvsplit c2배열\n", c2)
print("-"*60)

b2, c2 = np.hsplit(a2, [2])
print("\nhsplit b2배열\n", b2)
print("\nhsplit c2배열\n", c2)
print("-"*60)

a3 = np.arange(1, 28).reshape(3, 3, 3)
print("\na3배열\n", a3)
b3, c3 = np.dsplit(a3, [2])
print("\ndsplit b3배열\n", b3)
print("\ndsplit c3배열\n", c3)

 

결과

더보기
a2배열
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
------------------------------------------------------------

vsplit b2배열
 [[1 2 3]
 [4 5 6]]

vsplit c2배열
 [[7 8 9]]
------------------------------------------------------------

hsplit b2배열
 [[1 2]
 [4 5]
 [7 8]]

hsplit c2배열
 [[3]
 [6]
 [9]]
------------------------------------------------------------

a3배열
 [[[ 1  2  3]
  [ 4  5  6]
  [ 7  8  9]]

 [[10 11 12]
  [13 14 15]
  [16 17 18]]

 [[19 20 21]
  [22 23 24]
  [25 26 27]]]

dsplit b3배열
 [[[ 1  2]
  [ 4  5]
  [ 7  8]]

 [[10 11]
  [13 14]
  [16 17]]

 [[19 20]
  [22 23]
  [25 26]]]

dsplit c3배열
 [[[ 3]
  [ 6]
  [ 9]]

 [[12]
  [15]
  [18]]

 [[21]
  [24]
  [27]]]

 

출처: 이수안 컴퓨터 연구소, [Numpy] 배열 축 교환 함수 : np.transpose, np.swapaxes 사용법 정리 (tistory.com)

관련글 더보기