我有一个二维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吗?
答案 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.]])