>我正在寻找一种有效的方法来设置与非零值相邻的所有数组索引等于 1。 例如,如果我有一个名为arr
的数组,如下所示:
import numpy as np
arr = np.zeros((5,5))
arr[1,1] = arr[2,2] = arr[3,3] = arr[0,5] = 1
arr
# array([[ 0., 0., 0., 0., 0.],
# [ 0., 1., 0., 0., 0.],
# [ 0., 0., 1., 0., 0.],
# [ 0., 0., 0., 1., 0.],
# [ 1., 0., 0., 0., 0.]])
有没有一种简单的方法可以获取名为arr2
的数组,该数组保留所有非零值,但也将左/右和上/下邻居设置为等于 1 的非零值? 所以在这个可重现的小例子中,我想要一个看起来像这样的结果:
arr2
# array([[ 0., 1., 0., 0., 0.],
# [ 1., 1., 1., 0., 0.],
# [ 0., 1., 1., 1., 0.],
# [ 1., 0., 1., 1., 1.],
# [ 1., 1., 0., 1., 0.]])
不考虑对角线邻居。
根据评论(@Code-学徒(,这是我能够解决的问题。 看起来不是很"pythonic"(即优雅(,但唉,它完成了工作。 我认为对于更大的"现实世界"应用程序,有一种更简单的替代蛮力方法。
arr = np.zeros((5,5))
arr[1,1] = arr[2,2] = arr[3,3] = arr[0,4] = 1
arr2 = arr.copy()
for i in np.arange(0, arr.shape[0]):
for j in np.arange(0, arr.shape[1]):
im1 = i - 1
ip1 = i + 1
jm1 = j - 1
jp1 = j + 1
if(im1 >= 0):
if(arr[i, j] == 1 and arr[im1, j] == 0):
arr2[im1, j] = 1
if(ip1 < arr.shape[0]):
if(arr[i, j] == 1 and arr[ip1, j] == 0):
arr2[ip1, j] = 1
if(jm1 >= 0):
if(arr[i, j] == 1 and arr[i, jm1] == 0):
arr2[i, jm1] = 1
if(jp1 < arr.shape[1]):
if(arr[i, j] == 1 and arr[i, jp1] == 0):
arr2[i, jp1] = 1