python - 测量 numpy 2d 区域之间的边界重叠

标签 python arrays numpy multidimensional-array vectorization

我有一个很大的 numpy 2d (10000,10000),有很多区域(具有相同单元值的聚集单元)。我想要的是合并显示超过 35% 边界重叠的相邻区域。这种重叠应该通过将与邻居的共同边界的大小除以该区域的总边界大小来衡量。

我知道如何检测相邻区域( Look here ),但我不知道如何测量边界重叠。

由于我正在处理大型数组,矢量化解决方案将是最佳选择。

<小时/>

示例

#input
region_arr=np.array([[1,1,3,3],[1,2,2,3],[2,2,4,4],[5,5,4,4]])

enter image description here

邻居检测脚本的输出是一个 numpy 二维数组,其中区域位于第一列,邻居位于第二列。

#result of neighbour detection
>>> region_neighbour=detect_neighbours(region_arr)
>>> region_neighbour
array([[1, 2],
       [1, 3],
       [2, 1],
       [2, 3],
       [2, 4],
       [2, 5],
       [3, 1],
       [3, 2],
       [3, 4],
       [4, 2],
       [4, 3],
       [4, 5],
       [5, 2],
       [5, 4]])

我想在邻居检测的结果中添加一列,其中包含该区域与其邻居之间的重叠百分比。 区域 1 和区域 3 之间的重叠百分比 = 1/8 = 0.125 = 公共(public)边框大小/区域 1 的总边框大小。

在此示例中,所需的输出如下所示:

#output
>>> percentual_overlap=measure_border_overlap(region_arr,region_neighbour)
>>> percentual_overlap
array([[ 1.       ,  3.       ,  0.125   ],
       [ 1.       ,  2.       ,  0.375   ],
       [ 2.       ,  1.       ,  0.3     ],
       [ 2.       ,  3.       ,  0.3     ],
       [ 2.       ,  4.       ,  0.2     ],
       [ 2.       ,  5.       ,  0.2     ],
       [ 3.       ,  1.       ,  0.125   ],
       [ 3.       ,  2.       ,  0.25    ],
       [ 3.       ,  4.       ,  0.125   ],
       [ 4.       ,  2.       ,  0.375   ],
       [ 4.       ,  3.       ,  0.125   ],
       [ 4.       ,  5.       ,  0.125   ],
       [ 5.       ,  2.       ,  0.333333],
       [ 5.       ,  4.       ,  0.166667]])       

通过此输出,合并重叠超过 35% 的区域(区域 1 和 2;区域 4 和 2)相对容易。区域合并后,新数组将如下所示:

enter image description here

编辑

您可以通过应用 pv. 函数计算每个区域的周长.

最佳答案

看看这个 Count cells of adjacent numpy regions寻求灵感。我认为根据这些信息决定如何合并是一个有多个答案的问题;它可能没有唯一的解决方案,具体取决于您进行的顺序...

import numpy_indexed as npi

neighbors = np.concatenate([x[:, :-1].flatten(), x[:, +1:].flatten(), x[+1:, :].flatten(), x[:-1, :].flatten()])
centers   = np.concatenate([x[:, +1:].flatten(), x[:, :-1].flatten(), x[:-1, :].flatten(), x[+1:, :].flatten()])
border = neighbors != centers

(neighbors, centers), counts  = npi.count((neighbors[border], centers[border]))
region_group = group_by(centers)
regions, neighbors_per_region = region_group.sum(counts)
fractions = counts / neighbors_per_region[region_group.inverse]
for result in zip(centers, neighbors, fractions): 
    print(result)

关于python - 测量 numpy 2d 区域之间的边界重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39619187/

相关文章:

python - 是否有 Numpy 或 Pandas 设置在创建 NaN 值时发出警告

python - 如何在keras中将三维数组转换为五维数组

python - 如何从列中提取子字符串

python 从文件中分割字符串

python - Tkinter 。如何在顶级窗口等待变量时销毁根窗口

javascript - 有一个石头剪刀布柜台

python - Numpy - 修改匹配值旁边的值

python - 替换/更改 python 集中的项目

arrays - 为什么 Perl 有时会回收引用?

c# - 计算字节数组中位和的最快方法