【问题标题】:How do I create a numpy array that corresponds to whether a point is inside a numpy array of polygons?如何创建一个 numpy 数组,该数组对应于一个点是否在一个 numpy 多边形数组内?
【发布时间】:2019-06-04 17:01:52
【问题描述】:

这是我的尝试,但我得到了错误 "AttributeError: 'numpy.ndarray' object has no attribute 'contains'"

如果你们中的任何人可以帮助我理解如何在此代码中定义'y',使其成为一个 numpy 数组,其中 1 对应于包含指定点的多边形的索引,0 对应于包含指定点的多边形的索引不包含指定点我将不胜感激。

polygonss=[]
for i in range(0, len(verts)):
    polygonc = Polygon(verts[i])
    print (polygonc)
    polygonss.append(polygonc)
print (polygonss)
p=np.array(polygonss)
print (p)
vertsf=meshinformation_fine.celltoverticesandcentroid(0)[0]
point = Point(vertsf[0])
y=np.where(p.contains(point), 0, 1)
print (y)

【问题讨论】:

  • PointPolygon 不是 numpy 的一部分。它们来自其他地方(matplotlib.patchesshapely?找出在哪里。)这就是为什么您不能期望此类对象的 numpy 数组继承对象本身的行为。

标签: python arrays numpy


【解决方案1】:

一个numpy对象数组在这里对你不是特别有用,你也可以用列表理解来做这个过程

y = [p.contains(point) for p in polygonss]

但是,如果您要为大量点执行此操作,那么我建议您阅读 geopandas,它使您能够对几何图形进行矢量化计算并将其应用于表格数据。

【讨论】:

    【解决方案2】:

    首先,错误消息实际上是阻止您成功的原因。 .ndarray object 只是没有那个属性 contains

    这将您的问题呈现给solutions 之一,讨论如何检查元素是否在 numpy 数组中。

    如果我理解正确的话,可以代替包含的东西是该行之后的东西:

    y = np.zeros(len(p))
    for counter in range (0, len(p)):
        if point in p[counter]:
            y[counter] = 1 
    

    注意:如果您为变量添加示例值以及预期的输出,将会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-27
      • 2017-12-30
      • 1970-01-01
      • 2017-03-17
      • 2021-08-15
      • 1970-01-01
      • 2017-09-18
      相关资源
      最近更新 更多