Построить матрицу расстояний векторизованным способом (без петли) из координат широты и долготы - PullRequest
1 голос
/ 11 октября 2019

Я хотел бы придумать более быстрый способ создания матрицы расстояний между всеми широтными парами. Это QA адресует векторизованный путь со стандартной линейной алгеброй, но без координат Лат-Лона.

В моем случае эти лонг-лонги - это фермы. Вот мой код Python, который для полного набора данных (4000 (широта, долгота)) занимает не менее пяти минут. Есть идеи?

> def slowdistancematrix(df, distance_calc=True, sparse=False, dlim=100):
    """
    inputs: df

    returns:
    1.) distance between all farms in miles
    2.) distance^2

    """

    from scipy.spatial import distance_matrix
    from geopy.distance import geodesic

    unique_farms = pd.unique(df.pixel)
    df_unique = df.set_index('pixel')
    df_unique = df_unique[~df_unique.index.duplicated(keep='first')] # only keep unique index values
    distance = np.zeros((unique_farms.size,unique_farms.size))

    for i in range(unique_farms.size):
        lat_lon_i = df_unique.Latitude.iloc[i],df_unique.Longitude.iloc[i]
        for j in range(i):
            lat_lon_j = df_unique.Latitude.iloc[j],df_unique.Longitude.iloc[j]
            if distance_calc == True:
                distance[i,j] = geodesic(lat_lon_i, lat_lon_j).miles
                distance[j,i] = distance[i,j] # make use of symmetry

    return distance, np.power(distance, 2)

1 Ответ

2 голосов
/ 11 октября 2019

Мое решение - векторизованная версия этой реализации :

import numpy as np

def dist(v):
    v = np.radians(v)

    dlat = v[:, 0, np.newaxis] - v[:, 0]
    dlon = v[:, 1, np.newaxis] - v[:, 1]

    a = np.sin(dlat / 2.0) ** 2 + np.cos(v[:, 0]) * np.cos(v[:, 0]) * np.sin(dlon / 2.0) ** 2

    c = 2 * np.arcsin(np.sqrt(a))
    result = 3956 * c

    return result

Однако вам нужно будет преобразовать ваш фрейм данных в массив с использованием атрибута values. Например:

df = pd.read_csv('some_csv_file.csv')
distances = dist(df[['lat', 'lng']].values)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...