我不确定要搜索的关键字是什么,如果已经被问到,请链接响应并关闭此帖子。
我试图将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 我真的不明白他们为什么会出现同样的问题,因为那个人讨论的是将事情循环出来,所以更多的是“滚动”而不是转移。我也喜欢这里的解决方案,它非常简单易读。
再次编辑:修复了一些格式
答案 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