如何翻译/移动一个numpy数组?

时间:2017-07-02 19:35:14

标签: python arrays numpy

我不确定要搜索的关键字是什么,如果已经被问到,请链接响应并关闭此帖子。

我试图将numpy数组的非零条目按固定方向移动,例如,假设我有一个二维数组:

0 1 2 0
0 3 0 0
0 0 0 0
0 0 0 0

将它移动(1,1)会产生以下数组:

0 0 0 0
0 0 1 2
0 0 3 0
0 0 0 0

假设非零条目越界,它们就会被删除。我怎么能这样做?

编辑:显然有些重复吗? Shift elements in a numpy array 我真的不明白他们为什么会出现同样的问题,因为那个人讨论的是将事情循环出来,所以更多的是“滚动”而不是转移。我也喜欢这里的解决方案,它非常简单易读。

再次编辑:修复了一些格式

2 个答案:

答案 0 :(得分:1)

要简单地管理边缘,您可以在更大的阵列中放大阵列:

square=\
array([[0, 2, 2, 0],
       [0, 2, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]], dtype=int64)

n,m=square.shape
bigsquare=np.zeros((3*n,3*m),square.dtype) 
bigsquare[n:2*n,m:2*m]=square

然后换班只是一个观点:

def shift(dx,dy):
    x=n-dx
    y=m-dy
    return bigsquare[x:x+n,y:y+m]

print(shift(1,1))

#[[0 0 0 0]
# [0 0 2 2]
# [0 0 2 0]
# [0 0 0 0]]

答案 1 :(得分:0)

使用numpy中的roll方法。

>>> import numpy as np
>>> m
array([[0, 1, 2, 0],
       [0, 3, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])
>>> m = np.roll(m, 1, axis=0) # shift 1 place in horizontal axis
>>> m = np.roll(m, 1, axis=1) # shift 1 place in vertical axis
>>> m
array([[0, 0, 0, 0],
       [0, 0, 1, 2],
       [0, 0, 3, 0],
       [0, 0, 0, 0]])

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.roll.html