Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2D数组中的邻居_Python_Arrays_Algorithm_Numpy_Matrix - Fatal编程技术网

Python 2D数组中的邻居

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] ]) 在我看

我有一个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]
                 ])
在我看来,这是一个众所周知的问题,但我甚至还没有弄明白如何在搜索中表达它,因为我所寻找的一切都有点不同。 执行此操作的最佳方法是什么?

您可以将此函数与自定义结构数组一起使用
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]]

拉威尔可能比扁平的更可取