HOWTO · NumPy

NumPy 배열에서 요소의 첫 번째 인덱스 찾기

이 튜토리얼은 Python의 배열에서 요소의 인덱스를 찾는 방법을 보여줍니다

이 페이지의 내용

1차원 NumPy 배열에서 값의 첫 번째 인덱스를 찾으려면 일치 항목이 반드시 있다고 보장되는 경우 np.where(array == value)[0][0]을 사용합니다. 이 표현식은 첫 번째 일치 위치를 반환합니다. 값이 없을 수도 있다면 먼저 존재 여부를 확인하세요. NumPy 인덱스는 0부터 시작합니다.

np.where()로 첫 번째 일치 인덱스 찾기

np.where(condition)은 각 차원의 인덱스 배열을 담은 튜플을 반환합니다. 1차원 배열에서는 튜플의 첫 항목이 일치하는 위치를 담은 배열입니다. 첫 번째 일치 항목을 얻으려면 그 배열의 첫 항목을 선택합니다.

다음 예제를 실행합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import numpy as np

values = np.array([10, 20, 30, 40, 50, 20])
target = 20
matches = np.where(values == target)[0]
print(int(matches[0]))
1

여기서 matches에는 20이 나타나는 두 위치가 들어 있으며, matches[0]은 그중 첫 번째 위치를 선택합니다. 일치하는 값이 없으면 matches에 요소가 없으므로 인덱싱할 때 IndexError가 발생합니다. 일치 항목이 있다고 보장되지 않는다면 인덱스를 선택하기 전에 matches.size를 확인하세요. 세 인수를 받는 np.where(condition, x, y) 형식은 대신 조건에 따라 x 또는 y의 값을 선택합니다. 여기서처럼 인덱스를 반환하는 형식과는 다릅니다.

np.nonzero()로 일치하는 인덱스 찾기

불리언 조건에 np.nonzero()를 적용하면 참인 항목의 인덱스를 반환합니다. 인수를 하나 받는 np.where()와 마찬가지로 배열의 각 차원에 해당하는 인덱스 배열을 튜플로 반환합니다. 1차원 배열에서는 튜플의 첫 번째 배열을 사용합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import numpy as np

values = np.array([4, 7, 4, 9])
positions = np.nonzero(values == 4)[0]
print(positions.tolist())

결과에는 배열 순서대로 모든 일치 위치가 들어 있습니다. 첫 번째 일치 항목만 필요하다면 배열이 비어 있지 않은지 확인한 뒤 positions[0]을 사용하세요. 다차원 배열에서는 튜플의 각 항목이 한 차원의 좌표를 담습니다. 각 위치에 해당하는 항목끼리 짝지으면 각 일치 항목의 좌표를 얻을 수 있습니다.

불리언 일치 조건에 np.argmax() 사용하기

np.argmax()는 가장 큰 값의 위치를 반환합니다. 불리언 마스크에 적용하면 True가 False보다 크므로 첫 번째 True의 위치를 반환합니다. 모든 값이 False인 비어 있지 않은 마스크에서도 0을 반환하므로, 결과를 사용하기 전에 일치 항목이 있는지 확인하세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import numpy as np

values = np.array([5, 8, 3, 8])
mask = values == 8
first = int(np.argmax(mask)) if np.any(mask) else None
print(first)

이 패턴은 대상 값이 없으면 None을, 있으면 첫 번째 일치 위치를 반환합니다. 모든 일치 위치가 필요하다면 np.where() 또는 np.nonzero()를 사용하세요.

배열을 변환한 뒤 list.index() 사용하기

1차원 배열을 Python 목록으로 변환하면 목록 메서드인 list.index()를 사용할 수 있습니다. 이 메서드는 첫 번째 출현 위치를 반환합니다. 변환 과정에서 Python 목록이 새로 만들어지므로 시간과 메모리 비용이 추가됩니다. 따라서 작은 배열이나 이미 목록을 사용하는 코드에서 가장 편리한 방법입니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import numpy as np

values = np.array([10, 20, 30, 20])
items = values.tolist()
target = 20
index = items.index(target) if target in items else None
print(index)

포함 여부를 확인하면 값이 없을 때 결과가 None임을 명확히 처리할 수 있습니다. 반대로 값이 없는데 items.index(target)을 바로 호출하면 ValueError가 발생합니다. 포함 여부 확인과 인덱스 검색은 각각 목록을 훑으므로, 한 번만 검색한다면 list.index()를 try 문으로 감싸 ValueError를 처리할 수도 있습니다.

사용자 지정 로직에는 반복문 사용하기

각 요소에 적용할 사용자 지정 검사를 벡터화된 NumPy 조건으로 표현하기 어려울 때는 반복문이 유용합니다. 결과를 찾지 못했을 때 사용할 값으로 초기화한 뒤, 첫 번째 일치 항목을 찾으면 바로 반복을 멈춥니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import numpy as np

values = np.array([12, 15, 18, 21])
index = None

for position, value in enumerate(values):
    if value % 2 == 0 and value > 12:
        index = position
        break

print(index)

반복문은 요소를 하나씩 살펴보다가 두 조건을 모두 만족하는 첫 번째 값을 만나면 종료합니다. 단순한 동등성 검사에는 보통 NumPy 마스크가 더 간결합니다. 일치 규칙에 사용자 지정 분기나 상태가 필요할 때 반복문을 사용하세요.

일치 항목 없음, 중복 값, 배열 차원 처리하기

작업에 맞는 결과 형태를 선택하세요.

  • 1차원 배열에서 첫 번째 일치 항목을 찾으려면 np.where() 또는 np.nonzero()로 위치를 구하고, 하나 이상 있는지 확인한 뒤 첫 번째 위치를 선택합니다.
  • 모든 일치 항목이 필요하면 전체 인덱스 배열을 유지하세요. 값이 반복되면 위치도 여러 개 나오므로, 모두 필요한 경우 [0]으로 첫 번째 위치만 선택하지 마세요.
  • 2차원 배열에서 np.where(matrix == target)은 (row_indices, column_indices)를 반환합니다. 서로 대응하는 항목끼리 좌표 쌍을 이룹니다. 예를 들어 (rows[0], columns[0])은 첫 번째 일치 항목의 행과 열이며, 하나의 평탄화된 인덱스가 아닙니다.
  • 다차원 배열에서 평탄화된 위치가 필요하다면 먼저 배열을 평탄화한 뒤 평탄화된 값에서 검색합니다. 필요할 때 np.unravel_index()로 그 위치를 다시 좌표로 변환할 수 있습니다.
  • np.argmax()는 비어 있지 않은 모든-False 마스크에서 0을 반환하지만, 그 위치가 일치 항목을 뜻하지는 않습니다. 마스크가 비어 있으면 np.argmax()는 대신 ValueError를 발생시킵니다. 위의 가드된 표현식은 먼저 np.any(mask)를 확인하므로, 참인 항목이 없는 마스크와 빈 마스크 모두에서 None을 반환합니다.

일반적인 숫자 배열 검색에서는 첫 번째 일치 항목이나 모든 일치 항목이 필요할 때 np.where()를 바로 사용할 수 있습니다. 같은 참 조건의 위치를 구하려면 np.nonzero()를, 확인된 불리언 마스크에는 np.argmax()를, Python 목록이 이미 유용한 상황에는 list.index()를, 사용자 지정 일치 규칙에는 반복문을 사용하세요.