2016-10-31 7 views
0

Учитывая NumPy массив нулей, скажемКак заполнить Numpy массив нулей с единицами заданными индексами/координаты

arr = np.zeros((5, 5)) 

и массив индексов, которые представляют собой вершины многоугольника, скажем

verts = np.array([[0, 2], [2, 0], [2, 4]]) 

1) что такое элегантный способ сделать

for v in verts: 
    arr[v[0], v[1]] = 1 

, что полученный массив

In [108]: arr 
Out[108]: 
array([[ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 1., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

2) Как я могу заполнить массив из них таким образом, чтобы выходной массив

In [158]: arr 
Out[158]: 
array([[ 0., 0., 1., 0., 0.], 
     [ 0., 1., 1., 1., 0.], 
     [ 1., 1., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

ответ

2

Чтобы ответить на первую часть вашего вопроса: arr[tuple(verts.T)] = 1

verts.T переставляет свои показатели в (2, n) массив, где две строки соответствуют размерам строк и столбцов arr. Затем они распаковываются в кортеж (row_indices, col_indices), который затем используется для индексации в arr.

Мы могли бы записать это немного более пространно, как:

row_indices = verts[:, 0] 
col_indices = verts[:, 1] 
arr[row_indices, col_indices] = 1 

Для второй части, один метод, который будет работать для произвольных полигонов было бы использовать matplotlib.Path.contains_points, как описано here:

from matplotlib.path import Path 

points = np.indices(arr.shape).reshape(2, -1).T 
path = Path(verts) 
mask = path.contains_points(points, radius=1e-9) 
mask = mask.reshape(arr.shape).astype(arr.dtype) 

print(repr(mask)) 
# array([[ 0., 0., 1., 0., 0.], 
#  [ 0., 1., 1., 1., 0.], 
#  [ 1., 1., 1., 1., 1.], 
#  [ 0., 0., 0., 0., 0.], 
#  [ 0., 0., 0., 0., 0.]]) 
+0

Не следует 'маска [2,0]' быть 1? – DSM

+0

@DSM Я думаю, что это проблема с плавающей точкой - обходным путем является установка «радиуса» на небольшое положительное значение –

Смежные вопросы