Numpy 简明教程

NumPy - Advanced Indexing

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

有两种高级索引类型: IntegerBoolean

Integer Indexing

此机制有助于根据其 N 维度索引选择数组中的任何任意项目。每个整数数组表示该维度中索引的数量。当索引包含的整数数组数与目标 ndarray 的维度一样多时,它就会变得简单。

在以下示例中,从 ndarray 对象的每行中选择指定列的一个元素。因此,行索引包含所有行号,并且列索引指定要选择的元素。

Example 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]。

Example 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 对象。

可以通过将一片 (:) 或省略号 (…) 与索引数组一起使用,将高级和基本索引结合起来。以下示例对行使用切片,对列使用高级索引。当对两者使用切片时,结果相同。但是,高级索引会导致副本,并且可能有不同的内存布局。

Example 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]]

Boolean Array Indexing

此类高级索引在结果对象应该是布尔运算结果(例如比较运算符)时使用。

Example 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]

Example 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.]

Example 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]