将 numpy 数组转换为 Shapely Points 的最有效方法是什么?
What is the most efficient way to convert numpy arrays to Shapely Points?
我有一个函数输出点网格作为 x 和 y numpy 数组用于插值,但在我插值之前,我想使用 Geopandas 与我的研究边界进行交集(否则我一半的插值点落在在海洋中)。
我正在生成这样的点数:
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Point
x = np.linspace(0,100,100)
y = np.linspace(0,100,100)
x, y = np.meshgrid(x, y)
x, y = x.flatten(), y.flatten()
f, ax = plt.subplots()
plt.scatter(x, y)
plt.axis('equal')
plt.show()
是否有有效的方法将这些 numpy 数组转换为 shapely.Point([x, y])
,以便将它们放置在 geopandas 地理数据框中?
这是我目前的做法:
interp_points = []
index = 0
y_list = yi.tolist()
for x in xi.tolist():
interp_points.append(Point(x,y_list[index]))
index += 1
但似乎转换为列表然后迭代可能不是提高性能的好方法,我有大约 160,000 分。
shapely
没有内置的方法来执行此操作,因此您需要自己遍历这些值。为此,这应该是一种相当有效的方法:
In [4]: from geopandas import GeoSeries
In [5]: s = GeoSeries(map(Point, zip(x, y)))
In [6]: s.head()
Out[6]:
0 POINT (0 0)
1 POINT (1.01010101010101 0)
2 POINT (2.02020202020202 0)
3 POINT (3.03030303030303 0)
4 POINT (4.040404040404041 0)
dtype: object
In [6]: %timeit GeoSeries(map(Point, zip(x, y)))
114 ms ± 8.45 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
(或略有替代GeoSeries(list(zip(x, y))).map(Point)
)
查看此处的一些示例:http://geopandas.readthedocs.io/en/latest/gallery/create_geopandas_from_pandas.html
有一些(停滞的)工作将其直接包含在 geopandas 中:https://github.com/geopandas/geopandas/pull/75
我觉得这个方法不错:
import numpy as np
from shapely import geometry
points_np_array = np.random.rand(50,2)
polygon_1 = geometry.Polygon(np.squeeze(points_np_array))
更好地使用这个列表理解:
[元组(x) for x in arr.tolist()]
我有一个函数输出点网格作为 x 和 y numpy 数组用于插值,但在我插值之前,我想使用 Geopandas 与我的研究边界进行交集(否则我一半的插值点落在在海洋中)。
我正在生成这样的点数:
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Point
x = np.linspace(0,100,100)
y = np.linspace(0,100,100)
x, y = np.meshgrid(x, y)
x, y = x.flatten(), y.flatten()
f, ax = plt.subplots()
plt.scatter(x, y)
plt.axis('equal')
plt.show()
是否有有效的方法将这些 numpy 数组转换为 shapely.Point([x, y])
,以便将它们放置在 geopandas 地理数据框中?
这是我目前的做法:
interp_points = []
index = 0
y_list = yi.tolist()
for x in xi.tolist():
interp_points.append(Point(x,y_list[index]))
index += 1
但似乎转换为列表然后迭代可能不是提高性能的好方法,我有大约 160,000 分。
shapely
没有内置的方法来执行此操作,因此您需要自己遍历这些值。为此,这应该是一种相当有效的方法:
In [4]: from geopandas import GeoSeries
In [5]: s = GeoSeries(map(Point, zip(x, y)))
In [6]: s.head()
Out[6]:
0 POINT (0 0)
1 POINT (1.01010101010101 0)
2 POINT (2.02020202020202 0)
3 POINT (3.03030303030303 0)
4 POINT (4.040404040404041 0)
dtype: object
In [6]: %timeit GeoSeries(map(Point, zip(x, y)))
114 ms ± 8.45 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
(或略有替代GeoSeries(list(zip(x, y))).map(Point)
)
查看此处的一些示例:http://geopandas.readthedocs.io/en/latest/gallery/create_geopandas_from_pandas.html
有一些(停滞的)工作将其直接包含在 geopandas 中:https://github.com/geopandas/geopandas/pull/75
我觉得这个方法不错:
import numpy as np
from shapely import geometry
points_np_array = np.random.rand(50,2)
polygon_1 = geometry.Polygon(np.squeeze(points_np_array))
更好地使用这个列表理解:
[元组(x) for x in arr.tolist()]