### Numpy에서 `row`와 `col`을 사용한 Fancy Indexing 이해하기

Yeeun·2025년 4월 28일

Python

목록 보기
20/31

Numpy에서 rowcol을 사용한 Fancy Indexing 이해하기

이번 포스트에서는 Numpy에서 Fancy Indexing을 사용하여 배열에서 특정 요소를 선택하는 방법을 설명합니다. 이 과정에서 rowcol 배열을 사용하여 선택을 진행할 것입니다.


설정

먼저, np.arange를 사용해 3x4 행렬 X를 정의하고, 이를 리쉐이프하여 배열을 만듭니다:

import numpy as np

X = np.arange(12).reshape((3, 4))
print(X)

이 코드는 다음과 같은 행렬 X를 생성합니다:

X =
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

이제 이 행렬에서 특정 요소들을 선택할 것입니다.


Fancy Indexing이란?

Fancy Indexing은 배열의 특정 요소들을 배열 인덱스를 사용하여 선택하는 방법입니다. 우리는 rowcol 두 배열을 정의하여 이 인덱스들을 사용하여 X에서 요소들을 선택할 것입니다.

rowcol 배열을 정의해 봅시다:

row = np.array([0, 1, 2])
col = np.array([2, 1, 3])

여기서 row는 행 인덱스를, col은 열 인덱스를 나타냅니다. 두 배열을 결합하여 X에서 특정 요소들을 선택합니다.


Fancy Indexing을 이용한 요소 선택

이제 rowcol 배열을 사용해 X에서 특정 요소들을 선택해 봅시다:

result = X[row, col]
print(result)

작동 방식:

  • row[0] = 0col[0] = 2에서, 우리는 X[0, 2]를 선택합니다. 이 값은 2입니다.
  • row[1] = 1col[1] = 1에서, 우리는 X[1, 1]을 선택합니다. 이 값은 5입니다.
  • row[2] = 2col[2] = 3에서, 우리는 X[2, 3]을 선택합니다. 이 값은 11입니다.

결과는 다음과 같습니다:

array([ 2,  5, 11])

row[:, np.newaxis]col을 이용한 Broadcasting

이제 row 배열에 np.newaxis를 추가하여 2D 열 벡터로 변환해 보겠습니다:

result_broadcast = X[row[:, np.newaxis], col]
print(result_broadcast)

설명:

  • row[:, np.newaxis]row 배열을 (3,)에서 (3,1) 형태의 2D 배열로 변환합니다. 결과는 다음과 같습니다:
[[0]
 [1]
 [2]]
  • col 배열은 여전히 1D 배열로 [2, 1, 3]입니다.

이 두 배열을 결합하면, Numpy는 broadcasting을 통해 (3, 1) 형태의 row 배열을 (3,) 형태의 col 배열에 맞춰 확장합니다. 즉, 두 배열이 결합되어 모든 가능한 (행, 열) 조합을 인덱싱하게 됩니다.

row 가 (3,1) col이 (3,) 그래서 브로드캐스팅 해서 col이 (1,3) ->(3,3)로 바뀜.

213
213
213

row는 (3,1)이니 col과 항을 맞추기 위해 (3,3)됨

0 0 0
1 1 1
2 2 2

Broadcasted Array

이렇게 broadcasting을 통해 얻은 배열은 다음과 같습니다:

[[ 2  1  3]
 [ 6  5  7]
 [10  9 11]]
rowrowrowcolcolcol
000213
111213
222213

결과적으로 얻은 broadcasted 배열은 다음과 같습니다:

[[ 2  1  3]
 [ 6  5  7]
 [10  9 11]]

결론

Numpy에서의 Fancy IndexingBroadcasting은 배열에서 특정 요소들을 효율적으로 선택하고 조작할 수 있는 강력한 방법입니다. rowcol 인덱스를 결합하여 원하는 요소들을 선택하고, broadcasting을 통해 더 유연하고 효율적인 접근을 할 수 있습니다.

여러분도 다양한 인덱스와 배열 형태를 실험해 보며 Broadcasting의 원리를 이해해 보세요!

0개의 댓글