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 对象。
可以通过使用带有索引数组的切片 (:) 或省略号 (...) 来组合高级索引和基本索引。 以下示例对行使用切片,对列使用高级索引。 当 slice 用于两者时,结果是相同的。 但是高级索引会导致复制并且可能有不同的内存布局。
示例 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' # 现在我们将打印大于 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]