python - 在两个 numpy 形状对象数组上应用成对形状函数

标签 python arrays numpy shapely

我有两个不同长度的数组。一个包含有形状的多边形,另一个包含有形状的点。我想为两个数组中元素的每种可能组合运行 a_polygon.contains(a_point) shapely 函数。

我在看 this post因为构建一个包含行中所有可能组合的两列矩阵可能是一个理想的中间步骤。但是当输入数据很大时,'cartersian(arrays)' 函数中的循环可能会影响性能。

我尝试广播其中一个数组,然后应用 shapely 函数:

Polygons_array[:,newaxis].contains(Points_array)

但是,当然,那是行不通的。我知道最近发布的 geopandas 库,但它不是我的 Canopy 安装的选项。

最佳答案

以下代码展示了如何对包含在两个不同长度的数组中的几何对象应用函数。这种方法避免使用循环。需要 Pandas 的 apply 和 Numpy 的 .vectorize 和 broadcasting 选项。

首先考虑做一些导入和以下两个数组:

import numpy as np
import pandas as pd
from shapely.geometry import Polygon, Point

polygons = [[(1,1),(4,3),(4,1),(1,1)],[(2,4),(2,6),(4,6),(4,4),(2,4)],[(8,1),(5,1),(5,4),(8,1)]]
points = [(3,5),(7,3),(7,6),(3,2)]

包含多边形和点的几何对象的数组可以按照以下方式获得:

geo_polygons = pd.DataFrame({'single_column':polygons}).single_column.apply(lambda x: Polygon(x)).values
geo_points = pd.DataFrame({'single_column':points}).single_column.apply(lambda x: Point(x[0], x[1])).values
# As you might noticed, the arrays have different length.

现在要应用于两个数组的函数已定义并向量化:

def contains(a_polygon, a_point):
    return a_polygon.contains(a_point)
contains_vectorized = np.vectorize(contains)

这样,该函数就可以应用于向量中的每个元素。广播点数组处理成对评估:

contains_vectorized(geo_polygons, geo_points[:,np.newaxis])

返回以下数组:

array([[False,  True, False],
   [False, False, False],
   [False, False, False],
   [ True, False, False]], dtype=bool)

列对应于多边形,行对应于点。该数组中的 bool 值表明,例如,第一个点在第二个多边形内。没关系。映射多边形和点将证明是正确的:

from descartes import PolygonPatch
import matplotlib.pyplot as plt
fig = plt.figure(1, figsize = [10,10], dpi = 300)
ax = fig.add_subplot(111)
offset_x = lambda xy: (xy[0] + 0.1, xy[1])
offset_y = lambda xy: (xy[0], xy[1] - 0.5)
for i,j in enumerate(geo_polygons):
    ax.add_patch(PolygonPatch(j, alpha=0.5))
    plt.annotate('polygon {}'.format(i + 1), xy= offset_y(tuple(j.centroid.coords[0])))
for i,j in enumerate(geo_points):
    ax.add_patch(PolygonPatch(j.buffer(0.07),fc='orange',ec='black'))
    plt.annotate('point {}'.format(i + 1), xy= offset_x(tuple(j.coords[0])))
ax.set_xlim(0, 9)
ax.set_ylim(0, 7)
ax.set_aspect(1)
plt.show()

Mapped geometries

关于python - 在两个 numpy 形状对象数组上应用成对形状函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24932407/

相关文章:

python - 从 2D numpy 数组创建 COO 矩阵

python - Pandas 条形图到 numpy 数组

python - 类型错误 : unorderable types: dict() < dict()

c++ - c/c++ | int * 除外,给定 int (返回指针??)

python - 使用 Numpy 数组作为查找表

c++ - 对稀疏数组的高效多线程写访问?

java - Color.RGBToHSV 类型不匹配 : cannot convert from void to float[]

python - 单轴索引为字符串的 Numpy 数组(矩阵)

python - 我可以使用 'eval' 在 Python 中定义函数吗?

python - 使用tkinter绘制特定条形图