ndarray对象的内容可以通过索引或切片来访问和修改,就像Python的内置容器对象一样。如前所述,ndarray对象中的元素遵循基于零的索引。有3种可用的索引方法类型:字段访问、基本切片和高级索引。
基本切片是Python中基本切片概念到n维的扩展。通过将start、stop和step参数提供给内置的slice函数来构造一个Python slice对象。此slice对象被传递给数组来提取数组的一部分。
【例3.25】
import numpy as np a = np.arange(10) s = slice(2,7,2) print a[s]
输出如下:
[2 4 6]
在【例3.25】中,ndarray对象由arange()函数创建。然后,分别用起始值、终止值和步长值2、7和2定义切片对象。当这个切片对象传递给ndarray时,会对它的一部分进行切片,从索引2到7,步长为2。通过将由冒号分隔的切片参数(start:stop:step)直接提供给ndarray对象也可以获得相同的结果。
【例3.26】
import numpy as np a = np.arange(10) b = a[2:7:2] print b
输出如下:
[2 4 6]
如果只输入一个参数,那么将返回与索引对应的单个项目。如果使用a:,那么从该索引向后的所有项目将被提取。如果使用两个参数(以:分隔),那么对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。
【例3.27】
import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print a # 对始于索引的元素进行切片 print '现在我们从索引 a[1:] 开始对数组切片' print a[1:]
输出如下:
[[1 2 3] [3 4 5] [4 5 6]] 现在我们从索引 a[1:] 开始对数组切片 [[3 4 5] [4 5 6]]
切片还可以包括省略号(...),来使选择元组的长度与数组的维度相同。如果在行位置使用省略号,就会返回包含行中元素的ndarray。
如果一个ndarray是非元组序列,数据类型为整数或布尔值的ndarray,或者至少一个元素为序列对象的元组,我们就能够用它来索引ndarray。高级索引始终返回数据的副本。与此相反,切片只提供了一个视图。有两种类型的高级索引:整数和布尔值。
(1)整数索引
这种机制有助于基于N维索引来获取数组中的任意元素。每个整数数组表示该维度的下标值。当索引的元素个数就是目标ndarray的维度时,会变得相当直接。
以下示例获取了ndarray对象中每一行指定列的一个元素。因此,行索引包含所有行号,列索引指定要选择的元素。
【例3.28】
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)位置处的元素。
下面的示例获取了4×3数组中的每个角处的元素。行索引是[0,0]和[3,3],而列索引是[0,2]和[0,2]。
【例3.29】
import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print '我们的数组是:' print x print '\n' rows = np.array([[0,0],[3,3]]) cols = np.array([[0,2],[0,2]]) y = x[rows,cols] print '这个数组的每个角处的元素是:' print y
输出如下:
我们的数组是: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] 这个数组的每个角处的元素是: [[ 0 2] [ 9 11]]
返回的结果是包含每个角元素的ndarray对象。
高级和基本索引可以通过使用切片(:)或省略号(...)与索引数组组合。以下示例使用slice作为列索引和高级索引。当切片用于两者时,结果是相同的。但高级索引会导致复制,并且可能有不同的内存布局。
(2)布尔值索引
当结果对象是布尔运算(例如比较运算符)的结果时,将使用此类型的高级索引。
【例3.30】
这个例子中,大于5的元素会作为布尔索引的结果返回。
import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print '我们的数组是:' print x print '\n' # 现在我们会打印出大于 5 的元素 print '大于 5 的元素是:' print x[x > 5]
输出如下:
我们的数组是: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] 大于 5 的元素是: [ 6 7 8 9 10 11]