Python 从经纬度坐标以矢量化方式(无回路)构建距离矩阵
我想提出一种更快的方法来创建所有lat-lon对之间的距离矩阵。这解决了使用标准线性代数进行矢量化的问题,但没有Lat-Lon坐标 就我而言,这些狭长地带是农场。这是我的Python代码,对于完整的数据集(4000(lat,lon))至少需要五分钟。有什么想法吗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:
> 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,无]
应该这样做。