row와 col을 사용한 Fancy Indexing 이해하기이번 포스트에서는 Numpy에서 Fancy Indexing을 사용하여 배열에서 특정 요소를 선택하는 방법을 설명합니다. 이 과정에서 row와 col 배열을 사용하여 선택을 진행할 것입니다.
먼저, 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은 배열의 특정 요소들을 배열 인덱스를 사용하여 선택하는 방법입니다. 우리는 row와 col 두 배열을 정의하여 이 인덱스들을 사용하여 X에서 요소들을 선택할 것입니다.
row와 col 배열을 정의해 봅시다:
row = np.array([0, 1, 2])
col = np.array([2, 1, 3])
여기서 row는 행 인덱스를, col은 열 인덱스를 나타냅니다. 두 배열을 결합하여 X에서 특정 요소들을 선택합니다.
이제 row와 col 배열을 사용해 X에서 특정 요소들을 선택해 봅시다:
result = X[row, col]
print(result)
작동 방식:
row[0] = 0과 col[0] = 2에서, 우리는 X[0, 2]를 선택합니다. 이 값은 2입니다.row[1] = 1과 col[1] = 1에서, 우리는 X[1, 1]을 선택합니다. 이 값은 5입니다.row[2] = 2와 col[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
이렇게 broadcasting을 통해 얻은 배열은 다음과 같습니다:
[[ 2 1 3]
[ 6 5 7]
[10 9 11]]
| row | row | row | col | col | col |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 2 | 1 | 3 |
| 1 | 1 | 1 | 2 | 1 | 3 |
| 2 | 2 | 2 | 2 | 1 | 3 |
결과적으로 얻은 broadcasted 배열은 다음과 같습니다:
[[ 2 1 3]
[ 6 5 7]
[10 9 11]]
Numpy에서의 Fancy Indexing과 Broadcasting은 배열에서 특정 요소들을 효율적으로 선택하고 조작할 수 있는 강력한 방법입니다. row와 col 인덱스를 결합하여 원하는 요소들을 선택하고, broadcasting을 통해 더 유연하고 효율적인 접근을 할 수 있습니다.
여러분도 다양한 인덱스와 배열 형태를 실험해 보며 Broadcasting의 원리를 이해해 보세요!