参考文献:
https://www.zmonster.me/2016/03/09/numpy-slicing-and-indexing.html
https://www.quora.com/What-do-the-dots-mean-in-Python
python切片总结:
- 切片的形式arr[a:b,c:d,e:f]。 其中的a:b,c:d是不同维度的切片, 用逗号分割,代表不同的维度。切片从最外面的括号逐层向里读,比如下图的arr1是4*2*3的维度,arr1[0] = [[10,20,30],[40,50,60],[70,80,90]], arr1[0:2, 0] = [[10 20 30][11 22 33]],其中第一步arr1[0:2]选择了[[[10,20,30],[40,50,60]],[[11,22,33],[44,55,66]]]之后再选择每一个的.
note:可以理解为不断嵌套的for循环。for item1 in dimension1 choose[a:b], for item2 in dimension2 choose[c:d]
import numpy as np
arr1 = np.array([
[[10,20,30],[40,50,60]],
[[11,22,33],[44,55,66]],
[[11,22,33],[44,55,66]],
[[11,22,33],[44,55,66]],
])
- 冒号(即 :)代表从第一个到最后一个,即该维度所有的元素,其实和普通的a:b无本质差别
- 可以用…代表多个冒号:
import numpy as np
arr = np.arange(24).reshape((2, 3, 4))
print arr[1, ...] # 等价于 arr[1, :, :]
print arr[..., 1] # 等价于 arr[:, :, 1]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
[[ 1 5 9]
[13 17 21]]
import numpy as np
a = np.array(
[[[1, 1, 1.1, 0.1],
[1, 1, 1.2, 0.2],
[1, 1, 1.3, 0.3]],
[[1, 1, 1.4, 0.4],
[1, 1, 1.5, 0.5],
[1, 1, 1.6, 0.6]],
[[1, 1, 1.7, 0.7],
[1, 1, 1.8, 0.8],
[1, 1, 1.9, 0.9]]])
print(a[:,:,-1])
print(a[...,-1])
output:
[[0.1 0.2 0.3]
[0.4 0.5 0.6]
[0.7 0.8 0.9]]
[[0.1 0.2 0.3]
[0.4 0.5 0.6]
[0.7 0.8 0.9]]
其他参考资料
https://www.pythoninformer.com/python-libraries/numpy/index-and-slice/