Python 测量numpy 2d区域之间的边界重叠
我有一个大的numpy 2d(1000010000),有许多区域(具有相同单元格值的聚集单元格)。我想要的是合并显示超过35%边界重叠的相邻区域。这种重叠应通过将与相邻区域的公共边界大小除以该区域的总边界大小来衡量 我知道如何检测相邻区域(),但不知道如何测量边界重叠 由于我正在处理大型阵列,矢量化解决方案将是最理想的Python 测量numpy 2d区域之间的边界重叠,python,arrays,numpy,multidimensional-array,vectorization,Python,Arrays,Numpy,Multidimensional Array,Vectorization,我有一个大的numpy 2d(1000010000),有许多区域(具有相同单元格值的聚集单元格)。我想要的是合并显示超过35%边界重叠的相邻区域。这种重叠应通过将与相邻区域的公共边界大小除以该区域的总边界大小来衡量 我知道如何检测相邻区域(),但不知道如何测量边界重叠 由于我正在处理大型阵列,矢量化解决方案将是最理想的 例子 邻居检测脚本的输出是一个numpy二维数组,区域在第一列,邻居在第二列 #result of neighbour detection >>> regi
例子 邻居检测脚本的输出是一个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=公共边界大小/区域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)相对容易。区域合并后,新阵列将如下所示:
#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]])
编辑
您可以通过应用的函数来计算每个区域的周长。请查看此函数以获得灵感。我认为,决定如何根据这些信息进行合并是一个有多种答案的问题;它可能没有唯一的解决方案,这取决于您继续操作的顺序
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)
谢谢。输出确实不完全相似,但我肯定可以在我的代码中实现这种方法!这个答案中的一个小错误是返回的分数是整数(都是0)。我认为应该是这样的:分数=计数/每个区域的邻居[region\u group.inverse];它在python3下工作,但事实上,我认为在Python2中曾经是不同的