NumPy - 切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样。

如前所述,ndarray对象中的元素遵循基于零的索引。 有三种可用的索引方法类型: 字段访问,基本切片高级索引

基本切片是 Python 中基本切片概念到 n 维的扩展。 通过将startstopstep参数提供给内置的slice函数来构造一个 Python slice对象。 此slice对象被传递给数组来提取数组的一部分。

示例 1

  1. import numpy as np
  2. a = np.arange(10)
  3. s = slice(2,7,2)
  4. print a[s]

输出如下:

  1. [2 4 6]

在上面的例子中,ndarray对象由arange()函数创建。 然后,分别用起始,终止和步长值272定义切片对象。 当这个切片对象传递给ndarray时,会对它的一部分进行切片,从索引27,步长为2

通过将由冒号分隔的切片参数(start:stop:step)直接提供给ndarray对象,也可以获得相同的结果。

示例 2

  1. import numpy as np
  2. a = np.arange(10)
  3. b = a[2:7:2]
  4. print b

输出如下:

  1. [2 4 6]

如果只输入一个参数,则将返回与索引对应的单个项目。 如果使用start:,则从该索引向后的所有项目将被提取。 如果使用两个参数(以:分隔),则对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。

示例 3

  1. # 对单个元素进行切片
  2. import numpy as np
  3. a = np.arange(10)
  4. b = a[5]
  5. print b

输出如下:

  1. 5

示例 4

  1. # 对始于索引的元素进行切片
  2. import numpy as np
  3. a = np.arange(10)
  4. print a[2:]

输出如下:

  1. [2 3 4 5 6 7 8 9]

示例 5

  1. # 对索引之间的元素进行切片
  2. import numpy as np
  3. a = np.arange(10)
  4. print a[2:5]

输出如下:

  1. [2 3 4]

上面的描述也可用于多维ndarray

示例 6

  1. import numpy as np
  2. a = np.array([[1,2,3],[3,4,5],[4,5,6]])
  3. print a
  4. # 对始于索引的元素进行切片
  5. print '现在我们从索引 a[1:] 开始对数组切片'
  6. print a[1:]

输出如下:

  1. [[1 2 3]
  2. [3 4 5]
  3. [4 5 6]]
  4. 现在我们从索引 a[1:] 开始对数组切片
  5. [[3 4 5]
  6. [4 5 6]]

切片还可以包括省略号(...),来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的ndarray

示例 7

  1. # 最开始的数组
  2. import numpy as np
  3. a = np.array([[1,2,3],[3,4,5],[4,5,6]])
  4. print '我们的数组是:'
  5. print a
  6. print '\n'
  7. # 这会返回第二列元素的数组:
  8. print '第二列的元素是:'
  9. print a[...,1]
  10. print '\n'
  11. # 现在我们从第二行切片所有元素:
  12. print '第二行的元素是:'
  13. print a[1,...]
  14. print '\n'
  15. # 现在我们从第二列向后切片所有元素:
  16. print '第二列及其剩余元素是:'
  17. print a[...,1:]

输出如下:

  1. 我们的数组是:
  2. [[1 2 3]
  3. [3 4 5]
  4. [4 5 6]]
  5. 第二列的元素是:
  6. [2 4 5]
  7. 第二行的元素是:
  8. [3 4 5]
  9. 第二列及其剩余元素是:
  10. [[2 3]
  11. [4 5]
  12. [5 6]]