NumPy - 高级索引



可以从 ndarray 中选择一个非元组序列、整数或布尔数据类型的 ndarray 对象,或者至少包含一个序列对象的元组。高级索引始终返回数据的副本。与此相反,切片仅呈现视图。

高级索引有两种类型:**整数**和**布尔**。

整数索引

此机制有助于根据数组的 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(非数字)元素。

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] 
广告