HOWTO · NumPy

NumPy 배열에서 열을 가져오는 방법

2차원 NumPy 배열에서 열을 선택하고, 필요한 형태를 유지하고, 행을 필터링하며, 뷰와 복사본 중에서 선택합니다.

이 페이지의 내용

2차원 NumPy 배열에서 열 하나를 선택하려면 array[:, column_index]를 사용합니다. 콜론은 모든 행을 선택하고 정수는 0부터 시작하는 열을 선택합니다. 예를 들어 data[:, 1]은 두 번째 열을 1차원 배열로 반환합니다. 이후 코드에 2차원 (rows, 1) 결과가 필요하면 대신 data[:, 1:2]를 사용합니다.

열 하나를 선택하고 형태 제어하기

NumPy는 2차원 배열을 array[row_selection, column_selection] 형식으로 인덱싱합니다. 쉼표를 생략하면 연산이 달라집니다. data[:][1]은 먼저 전체 슬라이스를 만든 다음 행 1을 선택하므로 열 1을 선택하지 않습니다.

다음 예제는 일반적인 열 선택 사례를 재현 가능한 하나의 프로그램으로 보여 줍니다.

import numpy as np

data = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])

second = data[:, 1]
second_2d = data[:, 1:2]
adjacent = data[:, :2]
reordered = data[:, [2, 0]]
taken = np.take(data, [0, 2], axis=1)
filtered = data[data[:, 0] >= 20, 2]

print("second:", second, second.shape)
print("second_2d:\n", second_2d, second_2d.shape)
print("adjacent:\n", adjacent)
print("reordered:\n", reordered)
print("taken:\n", taken)
print("filtered:", filtered)

view = data[:, 1]
copy = data[:, 1].copy()
view[0] = 99
print("data after view edit:\n", data)
print("copy:", copy)

출력:

second: [11 21 31] (3,)
second_2d:
 [[11]
 [21]
 [31]] (3, 1)
adjacent:
 [[10 11]
 [20 21]
 [30 31]]
reordered:
 [[12 10]
 [22 20]
 [32 30]]
taken:
 [[10 12]
 [20 22]
 [30 32]]
filtered: [22 32]
data after view edit:
 [[10 99 12]
 [20 21 22]
 [30 31 32]]
copy: [11 21 31]

정수 열 인덱스는 해당 축을 제거하므로 second의 형태가 (3,)이 됩니다. 요소가 하나인 슬라이스는 축을 유지하므로 second_2d의 형태는 (3, 1)이 됩니다. 이 차이는 API가 평면 벡터가 아니라 행렬 형태의 입력을 요구할 때 중요합니다.

여러 열 선택하기

인접한 열에는 data[:, :2]와 같은 슬라이스를 사용합니다. 슬라이싱은 연속된 범위를 나타내며 일반적으로 뷰를 생성합니다. 인접하지 않은 열이나 사용자 지정 순서에는 인덱스 목록 data[:, [2, 0]]을 제공합니다. 이는 고급 인덱싱이며 뷰가 아닌 복사본을 생성합니다.

인덱스 목록은 항상 열 축을 유지합니다. 따라서 data[:, [1]]의 형태는 (3, 1)인 반면 data[:, 1]의 형태는 (3,)입니다. 목록은 열을 반복하거나 위치를 바꿀 수도 있으므로, 동적으로 제공된 인덱스에서 중복이나 순서가 예상 밖의 결과를 만들 수 있다면 검증하세요. 열이 단순한 범위를 이루면 슬라이스를 사용하고 선택 항목 자체가 시퀀스라면 인덱스 목록을 사용합니다.

np.take는 축을 명시하는 대안입니다. np.take(data, [0, 2], axis=1)은 열 0과 2를 선택합니다. 열은 두 번째 축에 있으므로 axis=1이 필수입니다. 축이나 인덱스가 변수에 저장되어 있을 때 특히 유용합니다.

열을 읽기 전에 행 필터링하기

불리언 조건은 일반적으로 열이 아니라 행을 식별합니다. 한 열에서 행 마스크를 만든 다음 쉼표 뒤에 원하는 출력 열을 지정합니다. 예제에서 data[:, 0] >= 20은 마지막 두 행을 유지하고 data[data[:, 0] >= 20, 2]는 열 2에서 [22 32]를 반환합니다. 마스크 길이는 행 수와 일치해야 합니다.

뷰와 복사본 중 필요한 것 선택하기

NumPy의 인덱싱 규칙에 따르면 기본 슬라이싱은 가능한 경우 뷰를 반환하지만 고급 인덱싱은 복사본을 반환합니다. 따라서 view = data[:, 1]을 통해 값을 할당하면 출력의 99가 보여 주듯이 data가 변경될 수 있습니다. 추출한 열이 독립적이어야 한다면 .copy()를 호출하세요. 뷰가 원본을 변경한 후에도 복사된 값은 [11 21 31]로 유지됩니다.

이러한 뷰는 기반 배열의 메모리도 계속 참조 가능한 상태로 유지합니다. 큰 원본 배열의 나머지가 더 이상 필요하지 않은데 이를 유지하면 메모리가 낭비되는 경우 작은 열을 복사하세요.

차원과 열 범위 확인하기

이 표현식들은 2차원 배열을 전제로 합니다. 1차원 배열에는 열 축이 없으므로 array[:, 0]은 인덱싱 오류를 발생시킵니다. 입력 형태가 확실하지 않다면 array.ndim == 2를 확인하세요. 2차원 배열의 유효한 음이 아닌 열 인덱스 범위는 0부터 array.shape[1] - 1까지이며, 범위를 벗어난 인덱스는 IndexError를 발생시킵니다. 음수 인덱스도 범위 안에서는 유효하므로 array[:, -1]은 마지막 열을 선택합니다.