Лучший способ передать повторный параметр векторизованной функции Numpy

Итак, продолжая обсуждение, @TheBlackCat и я имели вэтот ответЯ хотел бы знать, как лучше передать аргументы векторизованной функции Numpy. Рассматриваемая функция определяется следующим образом:

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

где,vincenty исходит отГеопакет.

Я сейчас звонюvect_dist_funct таким образом:

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

(Пожалуйста, обратитесь к вопросу здесь:Помеченные типы данных Python)

Мой вопрос касается того, что происходит внутри функцииpointer, Причина, по которой я конвертируюpoints кpandas.Series а затем получить значения (в 4-й строке, прямо подif утверждение), чтобы сделать его в той же форме, что и полигоны. Если я просто называю точки либо какpoints = [point]*len(intersect) или какpoints = itertools.repeat(point, len(intersect))Numpy жалуется, что «не может транслировать массивы размера (n, 2) и размера (n,) вместе» (n - длинаintersect).

Если я позвонюvect_dist_funct вот так:dist = vect_dist_funct(itertools.repeat(points, len(intersect)), polygons), vincenty жалуется, что я передал ему слишком много аргументов. Я в полном недоумении, чтобы понять разницу между ними.

Обратите внимание, что это координаты, поэтому всегда будут в парах. Вот примеры того, какpoint а такжеpolygons выглядит как:

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

Какой самый лучший способ позвонитьvect_dist_funct в таком случае, чтобы я мог сделать векторизованный вызов, и Нампи и Винсенти не будут жаловаться, что я передаю неправильные аргументы? Кроме того, ищутся методы, которые приводят к минимальному потреблению памяти и увеличению скорости. Цель состоит в том, чтобы вычислить расстояние между точкой до каждого центроида многоугольника.

Ответы на вопрос(1)

Ваш ответ на вопрос