• Python实现Matlab中的circshift函数


    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. ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    针对矩阵
    ##   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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    若 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]]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    示例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]]
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    示例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]]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    示例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]]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    Vue.js 修饰符:精准控制组件行为
    制胜充电桩下半场,特来电、星星充电们要靠运营?
    2020最新最全版!Java面试题大全
    接口中的抽象方法,默认方法,静态方法,私有方法
    DataGridXL 2.0 for JavaScript Crack
    Redis之性能指标、监控方式
    分享一点PDF中获取表格的探索过程
    33.2.4 配置Mycat负载均衡
    mac电脑识别不出来u盘?mac识别不了u盘怎么办
    Win 下 Docker 安装 Gitea 实践
  • 原文地址:https://blog.csdn.net/y15520833229/article/details/136235240