Два самых простых варианта - использовать matplotlib.nxutils.points_inside_poly
или mahotas.polygon.fill_polygon
.Последний немного быстрее, но требует установки mahotas
.
В качестве примера первого варианта:
import numpy as np
from matplotlib.nxutils import points_inside_poly
nx, ny = 10, 10
poly_verts = [(1,1), (5,1), (5,9),(3,2),(1,1)]
# Create vertex coordinates for each grid cell...
# (<0,0> is at the top left of the grid in this system)
x, y = np.meshgrid(np.arange(nx), np.arange(ny))
x, y = x.flatten(), y.flatten()
points = np.vstack((x,y)).T
grid = points_inside_poly(points, poly_verts)
grid = grid.reshape((ny,nx))
print grid
Какой выход (булев массив значений):
[[False False False False False False False False False False]
[False True True True True False False False False False]
[False False False True True False False False False False]
[False False False False True False False False False False]
[False False False False True False False False False False]
[False False False False True False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]]
С другой стороны, nxutils
в какой-то момент будет амортизироваться в пользу некоторых методов пути.В будущем вы, вероятно, захотите сделать что-то вроде:
from matplotlib import path
...
p = path.Path(poly_verts)
grid = p.contains_points(points)
...
Однако, это только сейчас в голове github.