python - 如何从位于数组顶部的多边形内的 NumPy 二维数组中提取值?

标签 python arrays algorithm python-3.x numpy

我的目标如下:给定一个二维数组和一个可以放在数组顶部的多边形,我想提取多边形内的值(包括边界)并对这些值求和。

假设我有一个这样的二维数组:

1 6 8 4 2 3
5 4 1 3 7 9
1 0 2 3 4 8
6 7 0 5 7 4
0 1 2 5 4 2

假设我有一个具有以下顶点的多边形:

(1, 2)
(2, 3)
(3, 3)
(4, 2)
(4, 1)
(3, 1)
(2, 1)
(1, 2)

将多边形放置在数组顶部会产生以下结果:

_ _ _ _ _ _
_ _ 1 _ _ _
_ 0 2 3 _ _
_ 7 0 5 _ _
_ 1 2 _ _ _

最后,我想对这些值求和。所以最终输出将是 21。

最有效的方法是什么?我已经看到对 matplotlib.path 和 Shapely 的引用,但我还没有找到任何适合我需要的东西,除非我只是遗漏了一些东西(这当然是可能的)。看起来这个功能应该内置到 NumPy 中,但我还没有遇到过它。

为什么我需要这个:我有一个代表全局人口的 ASCII 网格,并且我有政治边界。我想在人口网格上叠加政治边界以确定该位置的总人口数。

最佳答案

涉及的步骤-

  • 创建一个与图像数组形状相同的 bool 数组。

  • 使用给定的轮廓点填充轮廓。

  • 通过填充轮廓点形成的孔来创建多边形 Blob 。

  • 使用填充掩码对图像数组进行 bool 索引并获得总和。

实现-

from scipy.ndimage.morphology import binary_fill_holes as imfill

mask = np.zeros(img.shape,dtype=bool)
mask[idx[:,0], idx[:,1]] = 1
out = img[imfill(mask)].sum()

sample 运行-

1) 输入图像和多边形轮廓点:

In [107]: img
Out[107]: 
array([[1, 6, 8, 4, 2, 3],
       [5, 4, 1, 3, 7, 9],
       [1, 0, 2, 3, 4, 8],
       [6, 7, 0, 5, 7, 4],
       [0, 1, 2, 5, 4, 2]])

In [108]: idx
Out[108]: 
array([[1, 2],
       [2, 3],
       [3, 3],
       [4, 2],
       [4, 1],
       [3, 1],
       [2, 1],
       [1, 2]])

2) 提议的代码:

In [109]: mask = np.zeros(img.shape,dtype=bool)
     ...: mask[idx[:,0], idx[:,1]] = 1
     ...: out = img[imfill(mask)].sum()
     ...: 

3) 分析结果:

In [134]: imfill(mask) # Polygon mask
Out[134]: 
array([[False, False, False, False, False, False],
       [False, False,  True, False, False, False],
       [False,  True,  True,  True, False, False],
       [False,  True,  True,  True, False, False],
       [False,  True,  True, False, False, False]], dtype=bool)

In [135]: img[imfill(mask)]
Out[135]: array([1, 0, 2, 3, 7, 0, 5, 1, 2])

In [136]: img[imfill(mask)].sum()
Out[136]: 21

关于python - 如何从位于数组顶部的多边形内的 NumPy 二维数组中提取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42821711/

相关文章:

python - 使用 Python 比较两个不同的 csv 列时无法获取缺失的元素

python - 用最近的值采样

java - 找到最长的递减序列

java - 无法将 getBytes() 分配给字节数组

Python - 描述符 'split' 需要一个 'str' 对象但收到了一个 'unicode'

php - 将记录存储在父数组中

获得最佳文本颜色的算法

java - 我执行的插值搜索算法有什么问题?

vb.net - 交换两个整数而不使用第三个变量

Python:从数据框创建邻接矩阵