Заполнение определенной формы в массиве NumPy - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть двумерный массив 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 Ответ

2 голосов
/ 23 апреля 2019

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.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...