【问题标题】:Matrix Mirroring in pythonpython中的矩阵镜像
【发布时间】:2017-04-11 18:10:50
【问题描述】:

我有一个数字矩阵:

[[a, b, c] 
 [d, e, f] 
 [g, h, i]]

我希望得到相应的镜像:

[[g, h, i]
 [d, e, f]
 [a, b, c] 
 [d, e, f] 
 [g, h, i]]

然后再次屈服:

[[i, h, g, h, i]
 [f, e, d, e, f]
 [c, b, a, b, c] 
 [f, e, d, e, f] 
 [i, h, g, h, i]]

我想坚持使用基本的 Python 包,比如 numpy。提前感谢您的帮助!

【问题讨论】:

  • 有很多方法可以做到这一点,到目前为止你尝试了什么?
  • 列表推导是你的朋友。

标签: python arrays python-3.x numpy matrix


【解决方案1】:

这被标记为numpy,所以我假设你的矩阵是一个二维数组

In [937]: A=np.arange(9).reshape(3,3)
In [938]: A
Out[938]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

在行上翻转它:

In [939]: A[::-1,:]
Out[939]: 
array([[6, 7, 8],
       [3, 4, 5],
       [0, 1, 2]])

垂直连接

In [940]: np.concatenate((A[::-1,:],A), axis=0)
Out[940]: 
array([[6, 7, 8],
       [3, 4, 5],
       [0, 1, 2],
       [0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

删除重复的第一行

In [941]: np.concatenate((A[::-1,:],A[1:,:]), axis=0)
Out[941]: 
array([[6, 7, 8],
       [3, 4, 5],
       [0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

您认为水平(列)反转和连接(axis=1)也可以做到这一点吗?

【讨论】:

    【解决方案2】:

    这可以在纯 python 中使用一个简单的辅助函数来完成:

    def mirror(seq):
        output = list(seq[::-1])
        output.extend(seq[1:])
        return output
    
    inputs = [
       ['a', 'b', 'c'],
       ['d', 'e', 'f'],
       ['g', 'h', 'i'],
    ]
    print(mirror([mirror(sublist) for sublist in inputs]))
    

    显然,一旦创建了镜像列表,您就可以使用它来创建一个 numpy 数组或其他任何东西......

    【讨论】:

      【解决方案3】:

      这是一个非 numpy 解决方案:

      a = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
      b = list(reversed(a[1:])) + a # vertical mirror
      c = list(zip(*b)) # transpose
      d = list(reversed(c[1:])) + c # another vertical mirror
      e = list(zip(*d)) # transpose again
      

      【讨论】:

        【解决方案4】:

        假设你有

        from numpy import array, concatenate
        m = array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])
        

        您可以沿第一个(垂直)轴通过

        >>> m[::-1, ...]
        array([[7, 8, 9],
               [4, 5, 6],
               [1, 2, 3]])
        

        其中::-1 以-1 的步长选择从最后到第一行。

        要省略最后一行,请明确要求在 0 之前立即停止选择:

        >>> m[:0:-1, ...]
        array([[7, 8, 9],
               [4, 5, 6]])
        

        然后可以沿第一个轴连接

        p = concatenate([m[:0:-1, ...], m], axis=0)
        

        形成:

        >>> p
        array([[7, 8, 9],
               [4, 5, 6],
               [1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]])
        

        这也可以沿另一个轴重复:

        q = concatenate([p[..., :0:-1], p], axis=1)
        

        屈服

        >>> q
        array([[9, 8, 7, 8, 9],
               [6, 5, 4, 5, 6],
               [3, 2, 1, 2, 3],
               [6, 5, 4, 5, 6],
               [9, 8, 7, 8, 9]])
        

        【讨论】:

          【解决方案5】:
          import numpy as np
          
          X= [[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]]
          
          A = np.asanyarray(X)
          B= np.flipud(A)
          C= np.concatenate((B, A[1:]), axis=0)
          D = C[:,1:]
          F = np.fliplr(C)
          E = np.concatenate((F, D), axis=1)
          
          print(E)
          

          我已经添加了逐步转换。 flipud 和 flipud 参考

          输出

          [[9 8 7 8 9]
           [6 5 4 5 6]
           [3 2 1 2 3]
           [6 5 4 5 6]
           [9 8 7 8 9]]
          

          【讨论】:

            【解决方案6】:
            m = [['a', 'b', 'c'], 
                 ['d', 'e', 'f'], 
                 ['g', 'h', 'i']]
            
            m_m = [[m[abs(i)][abs(j)] 
                  for j in range(-len(m)+1, len(m))] 
                  for i in range(-len(m)+1, len(m))]
            

            或者使用 numpy

            m = array([['a', 'b', 'c'], 
                       ['d', 'e', 'f'], 
                       ['g', 'h', 'i']])
            
            m_m = m.T[meshgrid(*2*[abs(arange(-len(m) + 1, len(m)))])]
            

            【讨论】:

              【解决方案7】:

              将numpy.lib.pad 与'reflect' 一起使用

              m = [['a', 'b', 'c'], 
                   ['d', 'e', 'f'], 
                   ['g', 'h', 'i']]
              
              n=np.lib.pad(m,((2,0),(2,0)),'reflect')
              
              n
              Out[8]: 
              array([['i', 'h', 'g', 'h', 'i'],
                     ['f', 'e', 'd', 'e', 'f'],
                     ['c', 'b', 'a', 'b', 'c'],
                     ['f', 'e', 'd', 'e', 'f'],
                     ['i', 'h', 'g', 'h', 'i']], 
                    dtype='<U1')
              

              【讨论】:

              • 参见reflect 和symmetric 和wrap 的Numpy 文档np.pad 以及许多其他非常有趣和有用的模式!
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-04-16
              • 2018-04-02
              • 2013-12-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多