NumPy 高级索引
可以从ndarray中进行选择,该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]