NumPy-고급 인덱싱

튜플이 아닌 시퀀스 인 ndarray, 정수 또는 부울 데이터 유형의 ndarray 개체, 또는 적어도 하나의 항목이 시퀀스 개체 인 튜플에서 선택할 수 있습니다. 고급 인덱싱은 항상 데이터 사본을 반환합니다. 이와 반대로 슬라이싱은보기 만 제공합니다.

고급 인덱싱에는 두 가지 유형이 있습니다. IntegerBoolean.

정수 인덱싱

이 메커니즘은 N 차원 인덱스를 기반으로 배열에서 임의의 항목을 선택하는 데 도움이됩니다. 각 정수 배열은 해당 차원의 인덱스 수를 나타냅니다. 인덱스가 대상 ndarray의 차원만큼 많은 정수 배열로 구성되면 간단 해집니다.

다음 예에서는 ndarray 개체의 각 행에서 지정된 열의 한 요소가 선택됩니다. 따라서 행 인덱스에는 모든 행 번호가 포함되고 열 인덱스는 선택할 요소를 지정합니다.

예 1

import numpy as np 

x = np.array([[1, 2], [3, 4], [5, 6]]) 
y = x[[0,1,2], [0,1,0]] 
print y

출력은 다음과 같습니다.

[1  4  5]

선택 항목에는 첫 번째 배열의 (0,0), (1,1) 및 (2,0)에있는 요소가 포함됩니다.

다음 예에서는 4X3 배열의 모서리에 배치 된 요소가 선택됩니다. 선택 행 인덱스는 [0, 0] 및 [3,3]이고 열 인덱스는 [0,2] 및 [0,2]입니다.

예 2

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
   
print 'Our array is:' 
print x 
print '\n' 

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 
   
print 'The corner elements of this array are:' 
print y

이 프로그램의 출력은 다음과 같습니다.

Our array is:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]
 
The corner elements of this array are:                                        
[[ 0  2]                                                                      
 [ 9 11]]

결과 선택은 모서리 요소를 포함하는 ndarray 객체입니다.

인덱스 배열과 함께 하나의 슬라이스 (:) 또는 줄임표 (…)를 사용하여 고급 및 기본 인덱싱을 결합 할 수 있습니다. 다음 예에서는 행에 슬라이스를 사용하고 열에 고급 인덱스를 사용합니다. 슬라이스가 둘 다에 사용되는 경우 결과는 동일합니다. 그러나 고급 색인은 복사를 수행하고 다른 메모리 레이아웃을 가질 수 있습니다.

예제 3

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# slicing 
z = x[1:4,1:3] 

print 'After slicing, our array becomes:' 
print z 
print '\n'  

# using advanced index for column 
y = x[1:4,[1,2]] 

print 'Slicing using advanced index for column:' 
print y

이 프로그램의 출력은 다음과 같습니다.

Our array is:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]
 
After slicing, our array becomes:
[[ 4  5]
 [ 7  8]
 [10 11]]

Slicing using advanced index for column:
[[ 4  5]
 [ 7  8]
 [10 11]]

부울 배열 인덱싱

이러한 유형의 고급 인덱싱은 결과 개체가 비교 연산자와 같은 부울 연산의 결과 인 경우에 사용됩니다.

예 1

이 예에서 5보다 큰 항목은 부울 인덱싱의 결과로 반환됩니다.

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# Now we will print the items greater than 5 
print 'The items greater than 5 are:' 
print x[x > 5]

이 프로그램의 출력은 다음과 같습니다.

Our array is: 
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 
 
The items greater than 5 are:
[ 6  7  8  9 10 11]

예 2

이 예제에서 NaN (Not a Number) 요소는 ~ (보완 연산자)를 사용하여 생략됩니다.

import numpy as np 
a = np.array([np.nan, 1,2,np.nan,3,4,5]) 
print a[~np.isnan(a)]

그 출력은-

[ 1.   2.   3.   4.   5.]

예제 3

다음 예제는 배열에서 복잡하지 않은 요소를 필터링하는 방법을 보여줍니다.

import numpy as np 
a = np.array([1, 2+6j, 5, 3.5+5j]) 
print a[np.iscomplex(a)]

여기에서 출력은 다음과 같습니다.

[2.0+6.j  3.5+5.j]