NumPy:Indexing
NumPy 배열 Indexing 방법. 커뮤니티에선 Fancy indexing 라고 부르는듯함.
Indexing 에 사용 가능한 관련 객체들
- slice object (
:
) - Ellipsis (
...
) -
np.newaxis
Basic indexing
- Single element indexing
- Slicing and striding
- Dimensional indexing tools
Advanced indexing
- Integer array indexing
- Boolean array indexing
- Combining advanced and basic indexing
Indexing 방식을 복합적으로 사용할 경우 주의 사항
- ddrm#헤드 캠버를 계산한다 항목 참조.
WARNING |
개인적인 견해로 미리 결과부터 말하자면 Boolean 을 사용하는 Basic Indexing 방법만 사용하던가, 정확한 위치를 가리키는 Integer Array Indexing 방법만 사용하던가 해서 복잡도를 낮추는 방향이 적합해 보인다. |
import numpy as np
# 예시 데이터
thresh = np.zeros((10, 10)) # 10x10 크기의 배열로 예시
plate_head_5m, plate_head_2m = 2, 8 # 인덱스 범위 예시
head = thresh[plate_head_5m:plate_head_2m]
head_min = head.argmax(axis=1)
# head_min 위치에 127을 할당
for i, min_idx in enumerate(head_min):
thresh[plate_head_5m + i, min_idx] = 127
# 결과 출력
print(thresh)
for 루프를 사용하는건 Graceful 하지 못해보여서 다른 방법 찾음...
이렇게 하면 될듯 해서 적용했는데 이게 아니더라.
NumPy의 인덱싱 규칙 때문입니다. 핵심적인 차이를 설명드리면:
thresh[plate_head_5m:plate_head_2m, head_min]
의 경우:
- 첫 번째 인덱스 plate_head_5m:plate_head_2m는 행의 범위를 지정
- 두 번째 인덱스 head_min은 단일 배열
- NumPy는 이를 "모든 선택된 행에 대해 head_min의 모든 위치를 같이 적용"하려고 시도합니다.
이는 브로드캐스팅 법칙으로 인해 발생되는 현상인듯 하다.
plate_head_5m:plate_head_2m
는 slice 객체로 표현된다. 이를 Integer Array (row_indices
)로 변환하여 head_min
Array 값을 1:1로 매칭해서 처리해야 정상적으로 처리된다. 아래와 같이 np.arange
를 사용하면 된다:
import numpy as np
# 예시로 확인해보기
thresh = np.zeros((10, 10))
plate_head_5m, plate_head_2m = 2, 8
head = thresh[plate_head_5m:plate_head_2m]
head_min = np.array([1, 3, 2, 5, 4, 7]) # 예시 head_min 값
# 올바른 벡터화 방식
row_indices = np.arange(plate_head_5m, plate_head_2m)
thresh[row_indices, head_min] = 127