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)