看图像处理相关代码的时候常常会遇到一些numpy相关语法,简洁高效,看不懂就影响阅读的质量与速度,这篇文章帮助解决和记录常遇到的一些基于numpy的数组数据变换问题。
单维整数索引
>>> import numpy as np
>>>aaa = np.array(range(1,10))
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> aaa[1:5:2]
array([2, 4])
>>> aaa.reshape((3,-1))
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> aaa.reshape((3,-1))[0:2:2]
array([[1, 2, 3]])
#以整数作为索引,以[起始索引:终止索引:步长] 为格式索引,步长为1时可省略步长
单维数组索引
>>> aaa[[0]]
array([1])
>>> aaa[[0,2]]
array([1, 3])
>>> aaa.reshape((3,-1))
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> aaa.reshape((3,-1))[[0,2]]
array([[1, 2, 3],
[7, 8, 9]])
>>>aaa.reshape((3,-1))[[0,0,1,2,2,0,1]]
array([[1, 2, 3],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[7, 8, 9],
[1, 2, 3],
[4, 5, 6]])
# 已知数组a、b,使用a[b]进行索引,数组b中的值是a中元素所在的索引,b中元素个数可以超过a中元素个数。
多维整数索引
>>> aaa.reshape((3,1,-1))
array([[[1, 2, 3]],
[[4, 5, 6]],
[[7, 8, 9]]])
>>> aaa.reshape((3,1,-1))[0,0]
array([1, 2, 3])
>>>aaa.reshape((3,1,-1))[2,0,0:2]
array([7, 8])
# 索引之间用冒号是在同一维度上取值,用逗号是在不同维度上取值
多维数组索引
>>> aaa.reshape((3,1,-1))
array([[[1, 2, 3]],
[[4, 5, 6]],
[[7, 8, 9]]])
>>> aaa.reshape((3,1,-1))[[0,0,2],[0]]
array([[1, 2, 3],
[1, 2, 3],
[7, 8, 9]])
>>>aaa.reshape((3,1,-1))[[0,0,2],[0,0]]
IndexError: shape mismatch:
>>>aaa.reshape((3,1,-1))[[0,0,2],[0],[1]]
array([2, 2, 8])
>>>aaa.reshape((3,1,-1))[[0,0,2],[0],[1,0]]
IndexError: shape mismatch:
>>>aaa.reshape((3,1,-1))[[0,0,2],[0],[1,0,0]]
array([2, 1, 7])
>>>aaa.reshape((3,1,-1))[[0,0,2],[0],[1]]
array([2, 2, 8])
>>> aaa.reshape((3,1,-1))[[0,2]]
array([[[1, 2, 3]],
[[7, 8, 9]]])
>>> aaa.reshape((3,1,-1))[[0,2],[0]]
array([[1, 2, 3],
[7, 8, 9]])
>>> aaa.reshape((3,1,-1))[[0,2],[0,0]]
array([[1, 2, 3],
[7, 8, 9]])
>>>aaa.reshape((3,1,-1))[[0,2],[0,0],[0]]
array([1, 7])
>>>aaa.reshape((3,1,-1))[[0,2],[0,0],[0,1]]
array([1, 8])
# 多个数组当索引,可以在第一个数组中以目标所在索引取出多个索引目标,之后的索引数组要在第一个数组取出的结果上操作