Python 2D数组中的邻居
我有一个2D numpy数组,如下所示:Python 2D数组中的邻居,python,arrays,algorithm,numpy,matrix,Python,Arrays,Algorithm,Numpy,Matrix,我有一个2D numpy数组,如下所示: start = np.array([ [1,1,0,1], [1,0,0,1], [0,1,0,0] ]) 我需要得到相同的矩阵,但将每个值替换为邻域数,我可以在任何方向上移动一步,但只能沿着1 因此,我应该得到以下信息: finish = np.array([ [4,4,0,2], [4,0,0,2], [0,4,0,0] ]) 在我看
start = np.array([
[1,1,0,1],
[1,0,0,1],
[0,1,0,0]
])
我需要得到相同的矩阵,但将每个值替换为邻域数,我可以在任何方向上移动一步,但只能沿着1
因此,我应该得到以下信息:
finish = np.array([
[4,4,0,2],
[4,0,0,2],
[0,4,0,0]
])
在我看来,这是一个众所周知的问题,但我甚至还没有弄明白如何在搜索中表达它,因为我所寻找的一切都有点不同。
执行此操作的最佳方法是什么?您可以将此函数与自定义结构数组一起使用s
:
import numpy as np
from scipy.ndimage import label
start = np.asarray([ [1,1,0,1],
[1,0,0,1],
[0,1,0,0] ])
#structure array what to consider as "neighbors"
s = [[1,1,1],
[1,1,1],
[1,1,1]]
#label blobs in array
labeledarr,_ = label(start, structure=s)
#retrieve blobs and the number of elements within each blobs
blobnr, blobval = np.unique(labeledarr.ravel(), return_counts=True)
#substitute blob label with the number of elements
finish = np.zeros_like(labeledarr)
for k, v in zip(blobnr[1:], blobval[1:]):
finish[labeledarr==k] = v
print(finish)
输出:
[[4 4 0 2]
[4 0 0 2]
[0 4 0 0]]
我确信,具有其发生值的最后一步可以在速度方面进行优化。@mad physicator正确地提到,最初使用的
labeledar.flat
应该被labeledar.ravel()替换 您可以使用来标记连接的区域,并返回@Mr.T指出的区域数。这可用于创建用于索引和计数的布尔掩码
由于@T先生首先提出了一个类似的解决方案,因此应将其归功于@T先生。由于第二部分有所不同,所以这个答案仍在发布中,我发现它更具可读性,在我的机器上速度更快40%
将numpy导入为np
从scipy.ndimage导入标签
a=[[1,1,0,1],
[1,0,0,1],
[0,1,0,0]])
#标记连接的区域,第二个参数定义连接结构
标签,n_标签=标签(a,np.ones((3,3)))
#用连接区域的大小替换标签值
b=np.类零(带标签)
对于范围内的i(1,n_标签+1):
目标=(标记==i)
b[target]=np.count\u非零(target)
印刷品(b)
输出:
[[4 4 0 2]
[4 0 0 2]
[0 4 0 0]]
拉威尔可能比扁平的更可取