Python:对齐NumPy数组

发布于 2021-02-02 23:19:37

请我有点Python陌生,感觉很好,我可以说python很性感,直到我需要移动4x4矩阵的内容,我想在构建游戏的2048游戏演示时使用它,在这里,我有这个功能

def cover_left(matrix):
        new=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
        for i in range(4):
             count=0
             for j in range(4):
                if mat[i][j]!=0:
                    new[i][count]=mat[i][j]
                    count+=1
        return new

如果你这样调用它,这就是函数的作用

cover_left([
              [1,0,2,0], 
              [3,0,4,0], 
              [5,0,6,0], 
              [0,7,0,8]
          ])

它将覆盖左侧的零并产生

[  [1, 2, 0, 0],
   [3, 4, 0, 0],
   [5, 6, 0, 0],
   [7, 8, 0, 0]]

请让我帮助某人,以numpy达到更快的速度并且需要更少的代码(我在深度优先搜索算法中使用的代码),更重要的是cover_up,cover_down和

`cover_left`.
`cover_up`
    [  [1, 7, 2, 8],
       [3, 0, 4, 0],
       [5, 0, 6, 0],
       [0, 0, 0, 0]]
`cover_down`
    [  [0, 0, 0, 0],
       [1, 0, 2, 0],
       [3, 0, 4, 0],
       [5, 7, 6, 8]]
`cover_right`
    [  [0, 0, 1, 2],
       [0, 0, 3, 4],
       [0, 0, 5, 6],
       [0, 0, 7, 8]]
关注者
0
被浏览
65
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    这里有一个量化的方法,通过启发this other post和推广到覆盖non-zeros所有四个方向-

    def justify(a, invalid_val=0, axis=1, side='left'):    
        """
        Justifies a 2D array
    
        Parameters
        ----------
        A : ndarray
            Input array to be justified
        axis : int
            Axis along which justification is to be made
        side : str
            Direction of justification. It could be 'left', 'right', 'up', 'down'
            It should be 'left' or 'right' for axis=1 and 'up' or 'down' for axis=0.
    
        """
    
        if invalid_val is np.nan:
            mask = ~np.isnan(a)
        else:
            mask = a!=invalid_val
        justified_mask = np.sort(mask,axis=axis)
        if (side=='up') | (side=='left'):
            justified_mask = np.flip(justified_mask,axis=axis)
        out = np.full(a.shape, invalid_val) 
        if axis==1:
            out[justified_mask] = a[mask]
        else:
            out.T[justified_mask.T] = a.T[mask.T]
        return out
    

    样品运行

    In [473]: a # input array
    Out[473]: 
    array([[1, 0, 2, 0],
           [3, 0, 4, 0],
           [5, 0, 6, 0],
           [6, 7, 0, 8]])
    
    In [474]: justify(a, axis=0, side='up')
    Out[474]: 
    array([[1, 7, 2, 8],
           [3, 0, 4, 0],
           [5, 0, 6, 0],
           [6, 0, 0, 0]])
    
    In [475]: justify(a, axis=0, side='down')
    Out[475]: 
    array([[1, 0, 0, 0],
           [3, 0, 2, 0],
           [5, 0, 4, 0],
           [6, 7, 6, 8]])
    
    In [476]: justify(a, axis=1, side='left')
    Out[476]: 
    array([[1, 2, 0, 0],
           [3, 4, 0, 0],
           [5, 6, 0, 0],
           [6, 7, 8, 0]])
    
    In [477]: justify(a, axis=1, side='right')
    Out[477]: 
    array([[0, 0, 1, 2],
           [0, 0, 3, 4],
           [0, 0, 5, 6],
           [0, 6, 7, 8]])
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看