NumPy - 切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样。 如前所述,ndarray对象中的元素遵循基于零的索引。 有三种可用的索引方法类型: 字段访问,基本切片和高级索引。 基本切片是 Python 中基本切片概念到 n 维的扩展。 通过将start,stop和step参数提供给内置的slice函数来构造一个 Python slice对象。 此slice对象被传递给数组来提取数组的一部分。
NumPy - 高级索引
如果一个ndarray是非元组序列,数据类型为整数或布尔值的ndarray,或者至少一个元素为序列对象的元组,我们就能够用它来索引ndarray。 高级索引始终返回数据的副本。 与此相反,切片只提供了一个视图。 有两种类型的高级索引:整数和布尔值。
整数索引
这种机制有助于基于 N 维索引来获取数组中任意元素。 每个整数数组表示该维度的下标值。 当索引的元素个数就是目标ndarray的维度时,会变得相当直接。 以下示例获取了ndarray对象中每一行指定列的一个元素。 因此,行索引包含所有行号,列索引指定要选择的元素。
布尔索引
当结果对象是布尔运算(例如比较运算符)的结果时,将使用此类型的高级索引。
NumPy - 代码举例
import numpy as np
a1 = np.arange(10)
s1 = slice(2, 7, 2)
print(a1[s1])
print(a1[2:7:2]) # 切片参数(start:stop:step)
print(a1[3]) # 对单个元素进行切片
print(a1[3:]) # 对始于索引的元素进行切片
print(a1[3:6]) # 对索引之间的元素进行切片,默认step 1
a2 = np.array([[1, 2, 3], [3, 4, 5], [4, 5, 6], [6, 7, 8], [9, 10, 11]])
print(a2[1:])
print(a2[…, 1]) # 返回索引列的ndarray
print(a2[1, …]) # 返回索引行的ndarray
print(a2[1:, …]) # 返回第二行之后的行的所有列
print(a2[[0, 1, 2], [0, 1, 0]]) # 该结果包括数组中(0,0),(1,1)和(2,0)位置处的元素
rows = np.array([[0, 0], [3, 3]])
cols = np.array([[0, 2], [0, 2]])
print(a2[rows, cols]) # 包含每个角元素的ndarray对象
print(a2[1:4, [1, 2]]) # 组合使用
print(a2[a2 > 6]) # 切出大于6的元素
a3 = np.array([np.nan, 1, 2, np.nan, 3, 4, 5, 2 + 6j])
print(a3[~np.isnan(a3)]) # 使用了~(取补运算符)来过滤NaN
print(a3[np.iscomplex(a3)]) # 滤掉非复数元素