최근 NumPy로 데이터를 다루면서, x[x < 5] 같은 문법을 만났습니다.
처음에는 "왜 True인 인덱스를 가져오는 걸까?" 하고 생각했는데, 공부하면서 정확한 동작을 알게 되어 기록해둡니다.
예를 들어 이런 코드가 있습니다.
import numpy as np
x = np.array([[2, 6, 3, 8],
[1, 9, 4, 5],
[7, 0, 2, 3]])
result = x[x < 5]
print(result)
처음 생각한 착각:
x < 5를 하면 True/False로 이루어진 마스크가 생긴다.x[mask]를 하면 True인 인덱스를 가져오는 거다!하지만 실제 동작은 조금 다릅니다.
x < 5를 하면, x와 똑같은 모양(shape)의 Boolean 배열이 만들어집니다.# x < 5 결과:
[[ True False True False]
[ True False True False]
[False True True True]]
x[mask]를 하면, 이 True에 해당하는 값(value) 들만 모아서 1차원(flatten) 으로 반환합니다.# 실제 result 값
array([2, 3, 1, 4, 0, 2, 3])
즉, 인덱스를 가져오는 게 아니라 값 자체를 가져오는 것입니다!
만약 "어디가 True인지 위치(인덱스)를 알고 싶다"면 np.where()를 써야 합니다.
np.where(x < 5)
결과:
(array([0, 0, 1, 1, 2, 2, 2]), array([0, 2, 0, 2, 1, 2, 3]))
첫 번째 array는 행(row) 인덱스, 두 번째 array는 열(column) 인덱스입니다.
| 코드 | 의미 |
|---|---|
x[x < 5] | 조건을 만족하는 값들을 가져온다 (1D 배열) |
np.where(x < 5) | 조건을 만족하는 인덱스를 가져온다 (tuple of arrays) |
x[x < 5]는 "인덱스"를 가져오는 게 아니라 "값"을 가져온다.np.where()를 써야 한다.처음에는 헷갈릴 수 있는데, 한 번 정확히 이해하면 NumPy를 훨씬 자유롭게 쓸 수 있게 됩니다!