13 votes

Quel est le moyen le plus efficace de convertir des tableaux numpy en points Shapely ?

J'ai une fonction qui produit une grille de points sous forme de tableaux numpy x et y pour l'interpolation, mais avant d'interpoler, je veux utiliser Geopandas pour effectuer une intersection avec ma limite de recherche (sinon la moitié de mes points d'interpolation tombent dans l'océan).

Je génère des points comme ça :

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()

Existe-t-il une manière efficace de convertir ces tableaux numpy en shapely.Point([x, y]) pour qu'ils puissent être placés dans un cadre de géodonnées geopandas ?

C'est mon approche actuelle :

interp_points = []
index = 0
y_list = yi.tolist()
for x in xi.tolist():
    interp_points.append(Point(x,y_list[index]))
    index += 1

Mais il semble que la conversion en listes, puis l'itération, ne soit pas une bonne approche pour les performances, et j'ai environ 160 000 points.

6voto

joris Points 10700

Il n'y a pas de moyen intégré de faire cela avec shapely Vous devez donc itérer vous-même dans les valeurs. Pour ce faire, cette méthode devrait être assez efficace :

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)

(ou une légère alternative GeoSeries(list(zip(x, y))).map(Point) )

Voir ici pour un exemple de réalisation : http://geopandas.readthedocs.io/en/latest/gallery/create_geopandas_from_pandas.html

Il existe des travaux (au point mort) visant à inclure directement ces éléments dans les géopandas : https://github.com/geopandas/geopandas/pull/75

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X