Python 从经纬度坐标以矢量化方式(无回路)构建距离矩阵

Python 从经纬度坐标以矢量化方式(无回路)构建距离矩阵,python,vectorization,gis,Python,Vectorization,Gis,我想提出一种更快的方法来创建所有lat-lon对之间的距离矩阵。这解决了使用标准线性代数进行矢量化的问题,但没有Lat-Lon坐标 就我而言,这些狭长地带是农场。这是我的Python代码,对于完整的数据集(4000(lat,lon))至少需要五分钟。有什么想法吗 > def slowdistancematrix(df, distance_calc=True, sparse=False, dlim=100): """ inputs: df returns:

我想提出一种更快的方法来创建所有lat-lon对之间的距离矩阵。这解决了使用标准线性代数进行矢量化的问题,但没有Lat-Lon坐标

就我而言,这些狭长地带是农场。这是我的Python代码,对于完整的数据集(4000(lat,lon))至少需要五分钟。有什么想法吗

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

我的解决方案是以下的矢量化版本:

将numpy导入为np
def区(v):
v=np弧度(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.Arcin(np.sqrt(a))
结果=3956*c
返回结果
但是,您需要使用属性
将数据帧转换为numpy数组。例如:

df=pd.read\u csv('some\u csv\u file.csv'))
距离=距离(df[['lat','lng']]值)

签出,或用于处理坐标、处理大圆等。签出。请注意,您可以将自己的距离函数传递给
scipy.spatial
函数。谢谢!在走了几百英里后,我似乎得到了相当不同的答案。我刚才问了另一个问题:矩阵代数需要调整一下
np.cos[:,0,无]
应该这样做。