Skip to content

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 하지 못해보여서 다른 방법 찾음...

thresh[plate_head_5m:plate_head_2m, head_min] = 127

이렇게 하면 될듯 해서 적용했는데 이게 아니더라.

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_2mslice 객체로 표현된다. 이를 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

See also

Favorite site