【问题标题】:Matrix flip horizontal or vertical矩阵翻转水平或垂直
【发布时间】:2021-05-02 17:16:29
【问题描述】:

我正在尝试编写一个 python 函数来水平或垂直翻转矩阵。编写一个 Python 函数matrixflip(m,d),它接受一个二维矩阵和一个方向,其中 d 是“h”或“v”。如果d == 'h',该函数应该返回水平翻转的矩阵。如果d == 'v',该函数应该返回垂直翻转的矩阵。对于 d 的任何其他值,该函数应返回不变的 m。在所有情况下,参数 m 都应该不受函数的干扰。

import numpy as np
def matrixflip(m,d):
    m = myl
    myl = np.array([[1, 2], [3, 4]])
    if d=='v': 
        return np.flip(contour, axis=0)
    elif d=='h':
        return np.flip(contour, axis=1)

我希望输出为

>>> myl = [[1,2],[3,4]]

>>> myl
[[1, 2], [3, 4]]  

>>> matrixflip(myl,'h')
[[2, 1], [4, 3]]

>>> myl
[[1, 2], [3, 4]]  

>>> matrixflip(myl,'v')
[[3, 4], [1, 2]]  

>>> myl
[[1, 2], [3, 4]]  

【问题讨论】:

    标签: python numpy matrix flip


    【解决方案1】:

    我发现了可能的问题,当您将一个列表分配给另一个列表m = myl 时,您并没有创建该列表的新副本来玩弄,因此对 m 的任何更改都会影响 myl。通过将其替换为tempm = m.copy(),您将获得可以按照您的意愿弯曲的新版本列表。以下应该很好地工作:

    def matrixflip(m,d):
        tempm = m.copy()
        if d=='h':
            for i in range(0,len(tempm),1):
                    tempm[i].reverse()
        elif d=='v':
            tempm.reverse()
        return(tempm)
    

    【讨论】:

      【解决方案2】:

      试试这个:

      import numpy as np
      def matrixflip(m,d):
          myl = np.array(m)
          if d=='v': 
              return np.flip(myl, axis=0)
          elif d=='h':
              return np.flip(myl, axis=1)
      

      【讨论】:

        【解决方案3】:

        试试这个

        def matrixflip(a,b):
            temp=[]
            for i in range(len(a)):
                temp=temp+[a[i][:]]
            if b=='h':
                for i in range(len(temp)):
                    temp[i].reverse()
                    return(temp)
        
            elif b=='v':
                temp.reverse()
                return(temp)
        

        【讨论】:

          【解决方案4】:
          def matrixflip(a,b):
              temp=[]
              for i in range(len(a)):
                  temp=temp+[a[i][:]]
              if b=='h':
                  for i in range(len(temp)):
                      temp[i].reverse()
                      i=i+1
                  return temp
              elif b=='v':
                temp.reverse()
                return(temp)   
          

          【讨论】:

            【解决方案5】:
            def matrixflip(a,b):
                temp=[]
            
                for i in range(len(a)):
                    temp=temp+[a[i][:]]
            
                if b=='h':
                  for i in range(0,len(temp),1):
                          temp[i].reverse()
                elif b=='v':
                    temp.reverse()
                return(temp)
            

            【讨论】:

              【解决方案6】:

              有趣的问题。可以使用numpy函数flip。

              import numpy as np
              myl = [[1,2],[3,4]]
              

              对于水平翻转,使用索引 0:

              myl_flip_h = np.flip(myl,0) # horizontal flip
              
              >> array([[2, 1],
                 [4, 3]])
              

              对于垂直翻转使用索引 1:

              myl_flip_v = np.flip(myl,1) # vertical flip
              
              >>array([[3, 4],
                 [1, 2]])
              

              【讨论】:

                【解决方案7】:
                def matrixflip(m,d):
                    if d=='h':
                        m=myl
                        for i in range(0,len(m),1):
                                    m[i].reverse()
                        return(m)
                    elif d=='v':
                        m=myl
                        m.reverse()
                        return(m)
                    else:
                       return(m)
                

                【讨论】: