circshift是Matlab中矩阵循环移位函数,具体使用参照该链接。
但是python中并没有封装好的该函数,因此需要自己实现。
思路:将矩阵分为两部分,然后按照自己的需要堆叠在一起就可以了。
np.vstack用在行的分割;
np.hstack用在列的分割。
针对向量
## u代表原向量,shiftnum2代表移动的单位。
def circshift(u,shiftnum2):
w=len(u)
if shiftnum2 > 0:
u = np.hstack((u[(w - shiftnum2):], u[:(w - shiftnum2)]))
else:
u = np.hstack((u[-shiftnum2:],u[:-shiftnum2]))
return u
X=np.zeros(10)
X[0]=1
X[1]=2
X[2]=1
p=X/2
print(p)
print(circshift(p,2))
[0.5 1. 0.5 0. 0. 0. 0. 0. 0. 0. ]
[0. 0. 0.5 1. 0.5 0. 0. 0. 0. 0. ]
针对矩阵
## u代表原矩阵,shiftnum1代表行,shiftnum2代表列。
def circshift(u,shiftnum1,shiftnum2):
h,w = u.shape
if shiftnum1 < 0:
u = np.vstack((u[-shiftnum1:,:],u[:-shiftnum1,:]))
else:
u = np.vstack((u[(h-shiftnum1):,:],u[:(h-shiftnum1),:]))
if shiftnum2 > 0:
u = np.hstack((u[:, (w - shiftnum2):], u[:, :(w - shiftnum2)]))
else:
u = np.hstack((u[:,-shiftnum2:],u[:,:-shiftnum2]))
return u
若 shiftnum1大于0,则代表从上往下移动,否则就是从下往上移动;
若 shiftnum2大于0,则代表从左往右移动,否则就是从右往左移动;
示例1:
a = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
b = circshift(a,-1,0)
print(b)
输出:
[[4 5 6]
[7 8 9]
[1 2 3]]
示例2:
a = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
b = circshift(a,1,0)
print(b)
输出:
[[7 8 9]
[1 2 3]
[4 5 6]]
示例3:
a = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
b = circshift(a,0,1)
print(b)
输出:
[[3 1 2]
[6 4 5]
[9 7 8]]
示例4:
a = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
b = circshift(a,0,-1)
print(b)
输出:
[[2 3 1]
[5 6 4]
[8 9 7]]