使用numpy查找最近的位置

Vij*_*jay 5 python numpy pandas

我有2套地理代码作为熊猫系列,我试图找到从集合B中的点获得集合A中的点的最小欧氏距离的最快方法.即:距离最近点40.748043和-73.992953第二集,依此类推.非常感谢任何建议/帮助.

Set A:
    print(latitude1)
    print(longitude1)

    0    40.748043
    1    42.361016

    Name: latitude, dtype: float64
    0    -73.992953
    1    -71.020005
    Name: longitude, dtype: float64

Set B:
    print(latitude2)
    print(longitude2)

    0    42.50729
    1    42.50779
    2    25.56473
    3    25.78953
    4    25.33132
    5    25.06570
    6    25.59246
    7    25.61955
    8    25.33737
    9    24.11028
    Name: latitude, dtype: float64
    0     1.53414
    1     1.52109
    2    55.55517
    3    55.94320
    4    56.34199
    5    55.17128
    6    56.26176
    7    56.27291
    8    55.41206
    9    52.73056
    Name: longitude, dtype: float64
Run Code Online (Sandbox Code Playgroud)

jpp*_*jpp 3

这是仅使用numpy.linalg.norm.

import pandas as pd, numpy as np

df1['coords1'] = list(zip(df1['latitude1'], df1['longitude1']))
df2['coords2'] = list(zip(df2['latitude2'], df2['longitude2']))

def calc_min(x):
    amin = np.argmin([np.linalg.norm(np.array(x)-np.array(y)) for y in df2['coords2']])
    return df2['coords2'].iloc[amin]

df1['closest'] = df1['coords1'].map(calc_min)

#    latitude1  longitude1                  coords1              closest
# 0  40.748043  -73.992953  (40.748043, -73.992953)  (42.50779, 1.52109)
# 1  42.361016  -71.020005  (42.361016, -71.020005)  (42.50779, 1.52109)
# 2  25.361016   54.000000        (25.361016, 54.0)  (25.0657, 55.17128)
Run Code Online (Sandbox Code Playgroud)

设置

from io import StringIO

mystr1 = """latitude1|longitude1
40.748043|-73.992953
42.361016|-71.020005
25.361016|54.0000
"""

mystr2 = """latitude2|longitude2
42.50729|1.53414
42.50779|1.52109
25.56473|55.55517
25.78953|55.94320
25.33132|56.34199
25.06570|55.17128
25.59246|56.26176
25.61955|56.27291
25.33737|55.41206
24.11028|52.73056"""

df1 = pd.read_csv(StringIO(mystr1), sep='|')
df2 = pd.read_csv(StringIO(mystr2), sep='|')
Run Code Online (Sandbox Code Playgroud)

如果性能是一个问题,您可以通过底层 numpy 数组相当轻松地矢量化此计算。