在numpy数组中填充特定形状

时间:2019-04-23 12:33:28

标签: python numpy

我有一个二维numpy数组,想将其特定部分的值增加1。一个简单的示例是:

空数组:

[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]

我们决定以例如3点([[0,2],[2,4],[3,1]]),但点数也可以更高:

[[0 0 1 0 0]
 [0 0 0 0 0]
 [0 0 0 0 1]
 [0 1 0 0 0]
 [0 0 0 0 0]]

并用一个填充该多边形内的形状:

[[0 0 1 0 0]
 [0 0 1 1 0]
 [0 1 1 1 1]
 [0 1 1 0 0]
 [0 0 0 0 0]]

如何自动执行此操作?像这样:

arr = np.zeros([5,5])
shapePoints = [[0,2], [2,4], [3,1]]
valueToFill = 1
arr = fillShape(arr, shapePoints, valueToFill)

...其中 fillShape 是我要搜索的功能。那一定存在于numpy吗?

1 个答案:

答案 0 :(得分:1)

Scikit具有此类多边形绘制算法的实现。 参见skimage.draw.polygon

编辑:问题的具体代码

from skimage.draw import polygon, polygon_perimeter
import numpy as np
arr = np.zeros((5, 5))
shapePoints = np.array([[0,2], [2,4], [3,1]])
points_r, points_c = shapePoints[:, 0], shapePoints[:, 1]
interior_r, interior_c = polygon(points_r, points_c)
perimeter_r, perimeter_c = polygon_perimeter(points_r, points_c)
arr[perimeter_r, perimeter_c] = 3
arr[points_r, points_c] = 2
arr[interior_r, interior_c] = 1    

请注意,这与问题中的结果不同,以便说明内部和外围之间的差异。

>>> arr
array([[0., 0., 2., 0., 0.],
       [0., 0., 1., 3., 0.],
       [0., 3., 1., 1., 2.],
       [0., 2., 3., 0., 0.],
       [0., 0., 0., 0., 0.]])