inpolygon for Python - matplotlib.path.Path contains_points()方法的示例?

BJH*_*BJH 11 python matlab numpy matplotlib

我一直在寻找一个替代MATLAB的inpolygon()的python,我遇到了contains_points作为一个很好的选择.

但是,文档有点陈述,没有指示contains_points期望的数据类型:

contains_points(points,transform = None,radius = 0.0)

返回一个bool数组,如果路径包含相应的点,则该数组为True.

如果transform不是None,则在执行测试之前将转换路径.

radius允许路径略微变大或变小.

我将多边形存储为n*2 numpy数组(其中n非常大~500).据我所知,我需要在这个数据上调用Path()方法,这似乎工作正常:

poly_path = Path(poly_points)
Run Code Online (Sandbox Code Playgroud)

目前我还将我希望测试的点存储为另一个n*2 numpy数组(catalog_points).

也许我的问题在这里?当我跑步时:

in_poly = poly_path.contains_points(catalog_points)
Run Code Online (Sandbox Code Playgroud)

无论我使用的是什么点,我都会找回每个值包含'False'的ndarray(我已经在多边形内的点阵列上测试了这个).

mgi*_*son 29

通常在这些情况下,我发现源头是有启发性的......

我们可以看到源path.contains_point接受一个至少包含2个元素的容器.用于源contains_points是硬的比特弄清楚,因为它通过调用到C函数Py_points_in_path.看来这个函数接受一个迭代,它产生长度为2的元素:

>>> from matplotlib import path
>>> p = path.Path([(0,0), (0, 1), (1, 1), (1, 0)])  # square with legs length 1 and bottom left corner at the origin
>>> p.contains_points([(.5, .5)])
array([ True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

当然,我们也可以使用numpy数组:

>>> points = np.array([.5, .5]).reshape(1, 2)
>>> points
array([[ 0.5,  0.5]])
>>> p.contains_points(points)
array([ True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

只是为了检查我们并不总是得到True:

>>> points = np.array([.5, .5, 1, 1.5]).reshape(2, 2)
>>> points
array([[ 0.5,  0.5],
       [ 1. ,  1.5]])
>>> p.contains_points(points)
array([ True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

  • 单元测试/教学的好例子,检查正面和负面 (3认同)