购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.7 切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,就像Python的内置容器对象一样。如前所述,ndarray对象中的元素遵循基于零的索引。有3种可用的索引方法类型:字段访问、基本切片和高级索引。

1.切片

基本切片是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。

2.NumPy高级索引

如果一个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]

输出如下: R+7Oh/+RM9BJG/w/mYCoeVtX7bbOsIz2UEbV49ZtprMAJXaQOtuboJEChgm2wHmR

   我们的数组是:
   [[ 0  1  2]
    [ 3  4  5]
    [ 6  7  8]
    [ 9 10 11]]
    
   大于 5 的元素是:
   [ 6  7  8  9 10 11]
点击中间区域
呼出菜单
上一章
目录
下一章
×