파이썬/파이썬 심화

[파이썬 심화] 2-2. NumPy 배열 변형

Harvie 2023. 6. 1. 18:00
반응형

전치(transpose)

  • 행과 열을 바꾸는 작업 - T로 표기
a = np.array([[1,2,3],[4,5,6]])

print(a)
'''
[[1,2,3]
 [4,5,6]]
'''
print(a.T)
'''
[[1,4]
 [2,5]
 [3,6]]
'''

 

크기 변형

  • 배원 차원 변형 - reshape
a = np.arange(12)
print(a) # [0 1 2 3 4 5 6 7 8 9 10 11]

b=a.reshape(3,4)
print(b)
'''
[[0 1 2 3]
 [4 5 6 7]
 [8 9 10 11]]
'''

 

  • reshape() 함수 안에 -1로 대체 가능 ( 원소 개수는 정해져 있어서 가능 ) ※ reshape한 배열들은 완전히 다른 배열이다.
a = np.arange(12)
print(a) # [0 1 2 3 4 5 6 7 8 9 10 11]

b = a.reshape(3,-1)
print(b)
'''
[[0 1 2 3]
 [4 5 6 7]
 [8 9 10 11]]
'''
c = a.reshape(2,2,-1)
'''
[[[0 1 2]
  [3 4 5]]
  
 [[6 7 8]
  [9 10 11]]]
'''
d = a.reshape(2,-1,2)
'''
[[[0 1]
  [2 3]
  [4 5]]
  
 [[6 7]
  [8 9]
  [10 11]]]
'''

 

  • 1차원으로 변형 - flatten, ravel
print(b.flatten()) # [0 1 2 3 4 5 6 7 8 9 10 11]
print(b.ravel()) # [0 1 2 3 4 5 6 7 8 9 10 11]

 

배열 연결 (concatenate)

  • 행이 같은 두개 이상의 배열을 옆으로 연결 - hstack ( h는 horizontal(수평) )
a1 = np.ones((2,3))
print(a1)
'''
[[1. 1. 1.]
 [1. 1. 1.]]
'''
a2 = np.zeros((2,2))
print(a2)
'''
[[0. 0.]
 [0. 0.]]
'''

b = np.hstack([a1,a2])
print(b)
'''
[[1. 1. 1. 0. 0.]
 [1. 1. 1. 0. 0.]]
'''

 

  • 열이 같은 두개 이상의 배열을 위아래로 연결 - vstack ( v는 vertical(수직) )
a1 = np.ones((2,3))
print(a1)
'''
[[1. 1. 1.]
 [1. 1. 1.]]
'''
a2 = np.zeros((3,3))
print(a2)
'''
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
'''

b = np.vstack([a1,a2])
print(b)
'''
[[1. 1. 1.]
 [1. 1. 1.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
'''
  • 깊이(depth) 방향으로 배열을 연결 - dstack
a1 = np.ones((3,4))
print(a1)
'''
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
'''
a2 = np.zeros((3,4))
print(a2)
'''
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
'''

b = np.dstack([a1,a2]) # (3,4)였던 2차원 배열이 (3,4,2)인 3차원 배열로 바뀜.
print(b)
'''
[[[1. 0.]
  [1. 0.]
  [1. 0.]
  [1. 0.]]
  
 [[1. 0.]
  [1. 0.]
  [1. 0.]
  [1. 0.]]
  
 [[1. 0.]
  [1. 0.]
  [1. 0.]
  [1. 0.]]]
'''

 

  • axis 인수를 통해 추가되는 차원을 결정 - stack
a1 = np.ones((3,4))
print(a1)
'''
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
'''
a2 = np.zeros((3,4))
print(a2)
'''
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
'''

b = np.stack([a1,a2]) # axis 디폴트 값은 0 , (3,4)배열 두 개가 (2,3,4)배열이 됨
print(b)
'''
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]
 
 [[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]]
'''

c = np.stack([a1,a2],axis=1) # (3,4)배열 두 개가 (3,2,4)배열이 됨
print(c)
'''
[[[1. 1. 1. 1.]
  [0. 0. 0. 0.]]
 
 [[1. 1. 1. 1.]
  [0. 0. 0. 0.]]
  
 [[1. 1. 1. 1.]
  [0. 0. 0. 0.]]]
'''
d = np.stack([a1,a2],axis=2) # (3,4)배열 두 개가 (3,4,2)배열이 됨
print(d)
'''
[[[1. 0.]
  [1. 0.]
  [1. 0.]
  [1. 0.]]
  
 [[1. 0.]
  [1. 0.]
  [1. 0.]
  [1. 0.]]
 
 [[1. 0.]
  [1. 0.]
  [1. 0.]
  [1. 0.]]]
'''

 

  • 1차원 배열을 열(column)로 바꿔 좌우로 연결 - c_   ※ 이 친구는 특수 메서드여서 ()가 아닌 []을 사용합니다
a = np.array([0,1,2])
b = np.array([3,4,5])

print(c_[a,b])
'''
[[0 3]
 [1 4]
 [2 5]]
'''

 

  • 첫번째 차원을 기준으로 연결하여 연결 방향을 지정 - r_. ※ 이 친구는 특수 메서드여서 ()가 아닌 []을 사용합니다
# 1차원이 기준일 때
a = np.array([0,1,2])
b = np.array([3,4,5])
print(np.r_[a,b]) # [0 1 2 3 4 5]

# 2차원이 기준일 때
c = np.array([[0,1,2],[0,1,2]])
d = np.array([[3,4,5],[3,4,5]])
print(np.r_[c,d])
'''
[[0 1 2]
 [0 1 2]
 [3 4 5]
 [3 4 5]]
'''

# 연결 방향 지정 가능
print(np.r_['0',c,d]) # 디폴트 값
'''
[[0 1 2]
 [0 1 2]
 [3 4 5]
 [3 4 5]]
'''
print(np.r_['1',c,d]) # 1차원
'''
[[0 1 2 3 4 5]
 [0 1 2 3 4 5]]
'''

 

  • 동일한 배열을 반복하여 연결 - tile
a = np.array([[0,1,2],[3,4,5]])

print(np.tile(a,2))
'''
[[0 1 2 0 1 2]
 [3 4 5 3 4 5]]
'''

print(np.tile(a,(3,2))
'''
[[0 1 2 0 1 2]
 [3 4 5 3 4 5]
 [0 1 2 0 1 2]
 [3 4 5 3 4 5]
 [0 1 2 0 1 2]
 [3 4 5 3 4 5]]
'''

 

  • 그리드 포인트
x = np.arange(3) # [0 1 2]
y = np.arange(5) # [0 1 2 3 4]

X, Y = np.meshgrid(x,y) # 가로로 x배열 크기만큼(3), 세로로 Y배열 크기만큼(5)

print(X)
'''
[[0 1 2]
 [0 1 2]
 [0 1 2]
 [0 1 2]
 [0 1 2]]
'''

print(Y)
'''
[[0 0 0]
 [1 1 1]
 [2 2 2]
 [3 3 3]
 [4 4 4]]
'''

print([list(zip(x,y)) for x,y in zip(X,Y)]) # zip : 괄호 안의 요소를 묶어주는 함수
'''
[[(0,0),(1,0),(2,0)]
 [(0,1),(1,1),(2,1)]
 [(0,2),(1,2),(2,2)]
 [(0,3),(1,3),(2,3)]
 [(0,4),(1,4),(2,4)]]
'''

 

반응형