花式索引
切片
import numpy as np # 切片 a = np.arange(10) print("a:{}".format(a)) print("a[2:7:2]结果:{}".format(a[2:7:2])) 复制代码
结果:
a:[0 1 2 3 4 5 6 7 8 9] a[2:7:2]结果:[2 4 6] 复制代码
解析:
1.索引范围是2到7(不包含7)
2.切片步长是2
3.最终结果:
import numpy as np # 切片 a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) b = a[1:3, 0:2] print("a:{}".format(a)) print("b:{}".format(b)) 复制代码
结果:
a:[[1 2 3] [4 5 6] [7 8 9]] b:[[4 5] [7 8]] 复制代码
解析:
索引
import numpy as np # 索引 a = np.arange(10, 20) print("a:{}".format(a)) print("a[[1, 3, 6, 8]]结果:{}".format(a[[1, 3, 6, 8]])) 复制代码
结果:
a:[10 11 12 13 14 15 16 17 18 19] a[[1, 3, 6, 8]]结果:[11 13 16 18] 复制代码
解析: 1.逐个索引取数据
2.最终结果:
高级索引
import numpy as np # 高级索引 x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0, 2, 0], [0, 1, 1]] print("x:{}".format(x)) print("y:{}".format(y)) 复制代码
结果:
x:[[1 2] [3 4] [5 6]] y:[1 6 2] 复制代码
解析:
1.按照索引值定位子元素
2.在上一步的基础上进一步定位
3.最终结果:
import numpy as np # 高级索引 x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]) print('我们的数组x:') print(x) print('\n') rows = [[0, 0], [3, 3]] cols = [[0, 2], [0, 2]] y = x[rows, cols] print('这个数组的四个角元素是:') print(y) 复制代码
结果:
我们的数组x: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] 这个数组的四个角元素是: [[ 0 2] [ 9 11]] 复制代码
1.按索引位逐个取值
2.最终结果:
广播
import numpy as np #广播 a = np.array([[0, 0, 0], [10, 10, 10], [20, 20, 20], [30, 30, 30]]) b = np.array([1, 2, 3]) print(a + b) 复制代码
结果:
[[ 1 2 3] [11 12 13] [21 22 23] [31 32 33]] 复制代码
解析:
广播的规则:
1.让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
2.输出数组的形状是输入数组形状的各个维度上的最大值。
3.如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
4.当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
简单理解:
对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:
1.数组拥有相同形状。
2.当前维度的值相等。
3.当前维度的值有一个是 1。