当前位置: 首页 > 文档资料 > NumPy 教程 >

高级索引

优质
小牛编辑
136浏览
2023-12-01

有两种类型的高级索引:整数和布尔值。

这种机制有助于基于 N 维索引来获取数组中任意元素。 每个整数数组表示该维度的下标值。 当索引的元素个数就是目标的维度时,会变得相当直接。

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

输出如下:

  1. [1 4 5]

该结果包括数组中(0,0)(1,1)(2,0)位置处的元素。

示例 2

  1. import numpy as np
  2. x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
  3. print '我们的数组是:'
  4. print x
  5. print '\n'
  6. rows = np.array([[0,0],[3,3]])
  7. cols = np.array([[0,2],[0,2]])
  8. y = x[rows,cols]
  9. print '这个数组的每个角处的元素是:'
  10. print y

输出如下:

  1. 我们的数组是:
  2. [ 3 4 5]
  3. [ 6 7 8]
  4. [ 9 10 11]]
  5. [[ 0 2]
  6. [ 9 11]]

返回的结果是包含每个角元素的ndarray对象。

高级和基本索引可以通过使用切片:或省略号...与索引数组组合。 以下示例使用slice作为列索引和高级索引。 当切片用于两者时,结果是相同的。 但高级索引会导致复制,并且可能有不同的内存布局。

输出如下:

  1. 我们的数组是:
  2. [[ 0 1 2]
  3. [ 3 4 5]
  4. [ 6 7 8]
  5. [ 9 10 11]]
  6. 切片之后,我们的数组变为:
  7. [[ 4 5]
  8. [ 7 8]
  9. [10 11]]
  10. 对列使用高级索引来切片:
  11. [[ 4 5]
  12. [10 11]]

布尔索引

当结果对象是布尔运算(例如比较运算符)的结果时,将使用此类型的高级索引。

示例 1

  1. x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
  2. print '我们的数组是:'
  3. print x
  4. print '\n'
  5. # 现在我们会打印出大于 5 的元素
  6. print '大于 5 的元素是:'
  7. print x[x > 5]

输出如下:

  1. 我们的数组是:
  2. [[ 0 1 2]
  3. [ 3 4 5]
  4. [ 6 7 8]
  5. [ 9 10 11]]
  6. 大于 5 的元素是:
  7. [ 6 7 8 9 10 11]

这个例子使用了~(取补运算符)来过滤NaN

输出如下:

  1. [ 1. 2. 3. 4. 5.]

示例 3

以下示例显示如何从数组中过滤掉非复数元素。

  1. import numpy as np
  2. a = np.array([1, 2+6j, 5, 3.5+5j])

输出如下: