话不多说,直接上代码。
def circshift(matrix,shiftnum1,shiftnum2):
h,w=matrix.shape
matrix=np.vstack((matrix[(h-shiftnum1):,:],matrix[:(h-shiftnum1),:]))
matrix=np.hstack((matrix[:,(w-shiftnum2):],matrix[:,:(w-shiftnum2)]))
return matrix
上述代码中的matrix
代表的是要处理的矩阵,shiftnum1
代表要向下移动的行数,shiftnum2
代表要向左移动的列数。
中心思想
通过切片的方式,先将矩阵分成两部分,分割的位置是你设置移动数量。然后将分割成的两部分,堆叠在一切,就形成了新的移动的函数。
注意:hstack
是水平分割,用在列数的移动;vstack
是垂直分割,用于行数的移动。
效果举例
a=np.arange(1,17).reshape(4,4)
b=circshift(a,2,2)
print(a)
print(b)
上述例子将矩阵下移2行,左移2列。结果如下:
原矩阵:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
循环移位后的矩阵:
[[11 12 9 10]
[15 16 13 14]
[ 3 4 1 2]
[ 7 8 5 6]]
因为正好项目里要求矩阵的循环移位,而python里面没有现成的函数,所以顺手做出了这个函数。很简单,可以直接使用。