Python:对齐NumPy数组

请我有点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]]

回答:

这里有一个量化的方法,通过启发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]])

以上是 Python:对齐NumPy数组 的全部内容, 来源链接: utcz.com/qa/435306.html

回到顶部