본문 바로가기
Python/NumPy

[NumPy] 배열 변환 - (1)

by _sweep 2022. 1. 24.

이수안컴퓨터연구소NumPy 한번에 끝내기 영상을 보고 정리한 내용입니다.

 

 

 배열 전치와 축 변경

✔️numpy.ndarray.T

선형대수학에서 전치행렬은 행과 열을 교환하여 얻는 행렬이다.

즉, 주대각선을 기준으로 행렬을 뒤집은 것과 같다.

 

NumPy에서 전치행렬은 ndarray.T 혹은 ndarray.transpose()로 얻을 수 있다.

(ndarray.T가 self.transpose()와 같다.)

 

print(a2)
print(a2.T)

# output
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

# [[1 4 7]
#  [2 5 8]
#  [3 6 9]]

 

a2.T를 출력하자 주 대각선을 기준으로 전치된 행렬이 출력된 것을 확인할 수 있다.

이는 np.transpose(a2)와 a2.transpose()의 결과와 동일하다.

 

print(a3)
print(a3.T)

# output
# [[[1 2 3]
#  [4 5 6]
#  [7 8 9]]
#
#  [[1 2 3]
#   [4 5 6]
#   [7 8 9]]
#
#  [[1 2 3]
#   [4 5 6]
#   [7 8 9]]]


# [[[1 1 1]
#   [4 4 4]
#   [7 7 7]]
# 
#  [[2 2 2]
#   [5 5 5]
#   [8 8 8]]
# 
#  [[3 3 3]
#   [6 6 6]
#   [9 9 9]]]

 

✔️ numpy.swapaxes()

배열의 두 축을 교환한다.

 

numpy.swapaxes(a, axis1, axis2)
  • a : 축을 교환할 배열.
  • axis1 : 정수. 교환할 첫 번째 축.
  • axis2 : 정수. 교환할 두 번째 축.

 

print(a2)
print(a2.swapaxes(1, 0))

# output
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

# [[1 4 7]
#  [2 5 8]
#  [3 6 9]]

 

print(a3)
print(a3.swapaxes(0,1))
print(a3.swapaxes(1,2))

# output
# [[[1 2 3]
#   [4 5 6]
#   [7 8 9]]
# 
#  [[1 2 3]
#   [4 5 6]
#   [7 8 9]]
# 
#  [[1 2 3]
#   [4 5 6]
#   [7 8 9]]]

# [[[1 2 3]
#   [1 2 3]
#   [1 2 3]]

#  [[4 5 6]
#   [4 5 6]
#   [4 5 6]]
# 
#  [[7 8 9]
#   [7 8 9]
#   [7 8 9]]]

# [[[1 4 7]
#   [2 5 8]
#   [3 6 9]]
# 
#  [[1 4 7]
#   [2 5 8]
#   [3 6 9]]
# 
#  [[1 4 7]
#   [2 5 8]
#   [3 6 9]]]

 

 

 배열 재구조화

✔️ numpy.reshape()

값의 변경 없이 배열의 형상을 변경한다.

 

numpy.reshape(a, newshape, order='C')
  • a : array_like. 형상을 변경할 배열.
  • newshape : 정수 혹은 정수의 튜플. 변경할 형상.

 

n1 = np.arange(1, 10)
print(n1)
print(n1.reshape(3, 3))

# output
# [1 2 3 4 5 6 7 8 9]
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

 

numpy.arange를 이용해 1부터 9까지의 값을 가지는 1차원 배열인 n1을 만들었다.

numpy.reshape() 메서드로 n1을 3x3의 2차원 배열로 형변환을 시키면 값은 그대로 1부터 9까지의 수를 가진 3x3의 2차원 배열 형태가 된 것을 확인할 수 있다.

 

 

✔️ numpy.newaxis

배열에 새로운 축을 추가한다.

 

print(n1)
print(n1[np.newaxis, :5])
print(n1[:5, np.newaxis])

# output
# [1 2 3 4 5 6 7 8 9]
# [[1 2 3 4 5]]
# [[1]
#  [2]
#  [3]
#  [4]
#  [5]]

 

row에 np.newaxis를 적용했을 때와 column에 np.newaxis를 적용했을 때의 결과가 다른 것을 확인할 수 있다.

 

 

배열 크기 변경

✔️ numpy.resize()

배열의 형상을 변경하거나 배열의 크기를 변경한다.

변경할 형상의 사이즈와 원본 배열의 사이즈가 같을 경우에는 배열의 형상만 변경된다.

변경할 형상의 사이즈가 원본 배열의 사이즈보다 큰 경우에는 배열의 크기가 증가하며 남은 공간이 0으로 채워진다.

반대의 경우 배열의 크기가 감소하며 포함되지 않은 값은 삭제된다.

 

numpy.resize(a, new_shape)
  • a : array_like. 사이즈를 조절할 배열.
  • new_shape : 변경할 사이즈

 

n2 = np.random.randint(0, 10, (2, 3))
print(n2)

n2.resize((3, 2))
print(n2)

n2.resize((5, 5))
print(n2)

n2.resize((2,2))
print(n2)

# output
# [[8 8 5]
#  [1 8 8]]

# [[8 8]
#  [5 1]
#  [8 8]]

# [[8 8 5 1 8]
#  [8 0 0 0 0]
#  [0 0 0 0 0]
#  [0 0 0 0 0]
#  [0 0 0 0 0]]

# [[8 8]
#  [5 1]]

 

0부터 9의 랜덤한 정수값을 가지는 2x3의 2차원 배열 n2를 생성했다.

n2를 동일한 사이즈의 3x2 배열로 크기를 변경하면 값의 누락 없이 3x2의 배열로 변경된 것을 볼 수 있다.

 

n2를 기존 2x3의 사이즈보다 큰 5x5의 형상으로 변경하면 남는 공간이 모두 0으로 채워진 5x5의 배열이 된다.

마지막으로 이를 2x2의 형상으로 크기를 변경하면 앞에서부터 차례로 4개의 요소만이 배열에 저장되고 나머지 값은 삭제됐다.

 

 

🔍 참조

전치행렬 https://ko.wikipedia.org/wiki/%EC%A0%84%EC%B9%98%ED%96%89%EB%A0%AC

Array manipulation routines https://numpy.org/doc/stable/reference/routines.array-manipulation.html

numpy.newaxis https://numpy.org/doc/stable/reference/constants.html

numpy.resize https://numpy.org/doc/stable/reference/generated/numpy.resize.html

 

 

 

 

 

'Python > NumPy' 카테고리의 다른 글

[NumPy] 배열 연산 - (1)  (0) 2022.02.05
[NumPy] 배열 변환 - (2)  (0) 2022.02.02
[NumPy] 배열 값 삽입/수정/삭제/복사  (0) 2022.01.24
[NumPy] 인덱싱과 슬라이싱  (0) 2022.01.23
[NumPy] 배열 생성 - (2)  (0) 2022.01.23

댓글