HOWTO · NumPy

`numpy.newaxis`로 NumPy 배열에 축 추가하기

numpy.newaxis는 Python에서 NumPy 배열에 새 차원을 추가하는 데 사용할 수 있습니다.

이 페이지의 내용

numpy.newaxis는 인덱싱 표현식에서 사용하면 배열에 길이가 1인 축을 추가합니다. 기존 축 앞에 두면 행이 되고, 기존 축 뒤에 두면 열이 됩니다. shape이 (4,)인 1차원 배열에서는 각각 (1, 4)와 (4, 1)이 됩니다. 원래 값의 순서는 그대로 유지되고, 인덱싱으로 축을 삽입해 배열의 shape이 바뀝니다.

numpy.newaxis로 NumPy 배열에 축 추가하기

NumPy 인덱싱에서 numpy.newaxis는 Python의 None 객체를 가리키는 별칭입니다. 괄호를 붙여 호출하는 메서드가 아닙니다. numpy.newaxis documentation에서 이 인덱싱 상수를 설명합니다. 인덱스에서 array[np.newaxis, :]는 새 축을 맨 앞에 두고, array[:, np.newaxis]는 기존 축 뒤에 둡니다. 콜론은 기존 축의 모든 값을 유지합니다.

다음 예제는 NumPy가 설치된 환경에서 실행할 수 있습니다. 입력 배열과 두 인덱싱 결과의 shape 튜플 (4,), (1, 4), (4, 1)을 출력하며, 출력에는 별도의 영어 레이블이 없습니다.

import numpy as np

values = np.array([1, 2, 3, 4])
print(values.shape)

row = values[np.newaxis, :]
column = values[:, np.newaxis]
print(row.shape)
print(column.shape)
(4,)
(1, 4)
(4, 1)

첫 번째 shape은 네 개의 항목이 있는 축 하나를 나타냅니다. 행 형태에서는 새로 삽입된 첫 번째 축의 길이가 1이고, 원래 축의 길이는 여전히 4입니다. 열 형태에서는 네 항목이 있는 원래 축이 먼저 오고, 새 축의 길이가 1입니다. 따라서 shape은 (1, 4)와 (4, 1)이 됩니다. shape의 각 값은 서로 다른 값의 집합을 나타내는 것이 아니라 축의 순서를 따릅니다. 2차원 shape이라고 해서 데이터가 특별한 행렬 자료형이 되는 것은 아닙니다. NumPy는 여전히 이를 배열로 표현합니다.

같은 두 인덱스를 None으로도 쓸 수 있습니다. values[None, :]는 행 shape을 만들고, values[:, None]은 열 shape을 만듭니다. 주변 코드가 더 명확해지는 표기를 선택하세요. numpy.newaxis는 이미 여러 차원이 있는 배열에도 축을 추가할 수 있습니다. 인덱스에서의 위치가 결과 shape에서 길이가 1인 새 축의 위치를 정하므로, 뒤이은 연산에 사용하기 전에 인덱스 위치와 shape을 비교하세요.

축 추가는 브로드캐스팅을 포함해 다른 연산에서 차원 정렬이 필요할 때 유용합니다. 추가한 축의 길이는 1이며, 다른 차원들이 호환되면 브로드캐스팅으로 확장될 수 있습니다. 그렇다고 축을 추가하는 것만으로 모든 배열 쌍이 호환되는 것은 아닙니다. 행과 열 중 하나를 선택할 때는 먼저 결과 shape과 다음 연산에 필요한 축 순서를 살펴보세요. 그러면 인덱싱을 이해하기 쉽고 두 형태를 서로 바꿔 써도 된다고 섣불리 가정하지 않게 됩니다.

shape이 (2, 3)인 배열에서 matrix[:, :, None]은 축을 뒤에 추가해 shape (2, 3, 1)을 만들고, matrix[None, :, :]는 축을 앞에 추가해 (1, 2, 3)을 만듭니다. 두 경우 모두 원래 두 축의 순서와 길이는 유지됩니다. 여러 인덱스 위치를 사용할 때는 원래 shape을 적고 각 None 또는 numpy.newaxis가 들어가는 위치를 표시해 보세요. 그러면 배열을 다른 함수에 전달하기 전에 새 shape을 예측할 수 있습니다.