Beste Möglichkeit, wiederholte Parameter an eine Numpy-vektorisierte Funktion zu übergeben

So, Fortsetzung der Diskussion @TheBlackCat und ich hatten indiese Antwort, Ich möchte wissen, wie Argumente am besten an eine vektorisierte Numpy-Funktion übergeben werden können. Die betreffende Funktion ist folgendermaßen definiert:

vect_dist_funct = np.vectorize(lambda p1, p2: vincenty(p1, p2).meters)

wo,vincenty kommt vonGeopy package.

Ich rufe derzeitvect_dist_funct auf diese Weise

def pointer(point, centroid, tree_idx):
    intersect = list(tree_idx.intersection(point))
    if len(intersect) > 0:
        points = pd.Series([point]*len(intersect)).values
        polygons = centroid.loc[intersect].values
        dist = vect_dist_funct(points, polygons)
        return pd.Series(dist, index=intercept, name='Dist').sort_values()
    else:
        return pd.Series(np.nan, index=[0], name='Dist')

points['geometry'].apply(lambda x: pointer(point=x.coords[0], centroid=line['centroid'], tree_idx=tree_idx))

(Bitte beziehen Sie sich auf die Frage hier:Etikettierte Datentypen Python)

Meine Frage bezieht sich auf das, was in der Funktion passiertpointer. Der Grund, warum ich konvertierepoints zu einerpandas.Series und dann die Werte abrufen (in der 4. Zeile direkt unter demif statement) soll die gleiche Form haben wie Polygone. Wenn ich nur Punkte entweder alspoints = [point]*len(intersect) oder alspoints = itertools.repeat(point, len(intersect)), Numpy beschwert sich, dass es "keine Arrays der Größe (n, 2) und Größe (n,) zusammen senden kann" (n ist die Länge vonintersect).

Wenn ich rufevect_dist_funct wie so:dist = vect_dist_funct(itertools.repeat(points, len(intersect)), polygons), vincenty beschwert sich, dass ich zu viele Argumente übergeben habe. Ich bin völlig ratlos, den Unterschied zwischen den beiden zu verstehen.

Bitte beachten Sie, dass dies Koordinaten sind und daher immer paarweise sind. Hier sind Beispiele, wiepoint undpolygons aussehen wie

point = (-104.950752   39.854744) # Passed directly to the function like this.
polygons = array([(-104.21750802451864, 37.84052458697633),
                  (-105.01017084789603, 39.82012158954065),
                  (-105.03965315742742, 40.669867471420886),
                  (-104.90353460825702, 39.837631505433706),
                  (-104.8650601872832, 39.870796282334744)], dtype=object)
           # As returned by statement centroid.loc[intersect].values

Was ist der beste Weg, um @ anzurufvect_dist_funct unter diesen Umständen, so dass ich einen vektorisierten Anruf haben kann und sowohl Numpy als auch Vincent sich nicht beschweren, dass ich falsche Argumente übergebe? Es wird auch nach Techniken gesucht, die zu einem minimalen Speicherverbrauch und einer erhöhten Geschwindigkeit führen. Das Ziel besteht darin, die Entfernung zwischen dem Punkt und jedem Polygonschwerpunkt zu berechnen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage