NumPy 切片和索引
在 1-03 Python 基本数据类型 有介绍过 Python 基本的索引与切片,不过主要是针对列表,本节主要针对的是 NumPy 的切片和索引。以下实例是通过冒号分隔切片参数 start:stop:step 来进行切片操作。
实例
import numpy as np
a = np.arange(10)
b = a[2:7:2] # 从索引 2 开始到索引 7 停止,间隔为 2
print(b)
输出结果为:
[2 4 6]
多维数组同样适用上述索引提取方法,下例中 a 为一个 3*2 的二维数组。
实例
import numpy as np
a = np.array([[1,2],[3,4],[5,6]])
print(a)
# 从某个索引处开始切割
print('从数组索引 a[1:] 处开始切割')
print(a[1:])
输出结果为:
[[1 2]
[3 4]
[5 6]]
从数组索引 a[1:] 处开始切割
[[3 4]
[5 6]]
切片还可以包括省略号 … ,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
实例
import numpy as np
a = np.array([[1,2],[3,4],[5,6]])
print (a) # a 为一个 3 (行) * 2(列) 的 ndarray
print (a[0,1]) # 第 1 行,第 2 列的元素,应为 2
print (a[...,1]) # 第 2 列元素 [2,4,6],直切片,选定特定列数
print (a[1,...]) # 第 2 行元素,为 [3,4],横切片,选定特定行数
print (a[1:,...]) # 第 1 行及剩下的所有元素
输出结果为:
[[1 2]
[3 4]
[5 6]]
2
[2 4 6]
[3 4]
[[3 4]
[5 6]]
NumPy 提供更便利的索引方式,比方来说我们要针对以下数组取出三个元素分别是 (0,0) , (1,1) 和 (2,0) 位置处的元素,同常我们会分三次来获取数据,就是 a(0,0) , a(1,1) 和 a(2,0),但是 NumPy 可以透过数组索引的方式,分别将维度 1(行)与维度 2 (列)的位置,分别形成一个数组 ( 0, 1, 2) 与 ( 0, 1, 0),在当成索引的方式来获取这三个元素。
实例
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
print(a[0,0],a[1,1],a[2,0]) # 逐个索引
fastindex = a[[0,1,2], [0,1,0]] # 数组索引
print (fastindex)
输出结果为:
1 4 5
[1 4 5]
可以借助切片 : 或 … 与索引数组组合。如下面例子。
实例
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b)
print(c)
print(d)
输出结果为:
[[5 6]
[8 9]]
[[5 6]
[8 9]]
[[2 3]
[5 6]
[8 9]]
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
实例
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
# 现在我们会打印出大于 5 的元素
print ('大于 5 的元素是:')
print (a > 5)
print (a[a > 5])
输出结果为:
[[False False False]
[False False True]
[ True True True]]
[6 7 8 9]