• 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
  • 相关阅读:
    vuepress简单使用
    haproxy负载均衡
    工具篇--分布式定时任务springBoot--elasticjob简单使用(1)
    windows下安装部署 hadoop
    Vue3使用ElementUI按需自动引入
    Docker01基础操作
    面经自己汇总(三维视觉算法)——持续更新
    2022年全球市场肌腱固定螺钉总体规模、主要生产商、主要地区、产品和应用细分研究报告
    Tomcat--Linux下如何配置2个或多个同时运行
    初识OpenGL (-)顶点之“链接顶点属性“
  • 原文地址:https://blog.csdn.net/y15520833229/article/details/136235240