转换函数以减少计算时间(python)

转换函数以减少计算时间(python),python,performance,lambda,runtime,nested-loops,Python,Performance,Lambda,Runtime,Nested Loops,我试图将函数转换为更优化的方式,以减少计算时间。更具体地说,我希望与plot2的所有点(其中plot1、plot2数据帧带有纬度、经度列)相比,保持plot1每个点的最小哈弗斯线距离。这是我的密码: def计算最小哈弗线距离(图1、图2): 对于索引,plot1.iterrows()中的行: 最低=100000000 对于index2,plot2.iterrows()中的第2行: dis=哈弗森距离(行。纬度,行。经度,行2。纬度,行2。经度) 如果(dis我不确定如何摆脱第一个循环,但这将帮助

我试图将函数转换为更优化的方式,以减少计算时间。更具体地说,我希望与plot2的所有点(其中plot1、plot2数据帧带有纬度、经度列)相比,保持plot1每个点的最小哈弗斯线距离。这是我的密码:

def计算最小哈弗线距离(图1、图2):
对于索引,plot1.iterrows()中的行:
最低=100000000
对于index2,plot2.iterrows()中的第2行:
dis=哈弗森距离(行。纬度,行。经度,行2。纬度,行2。经度)

如果(dis我不确定如何摆脱第一个循环,但这将帮助您摆脱第二个循环:

def calculate_min_haversine_distance(plot1, plot2):
    for index,row in plot1.iterrows():
        plot2['dist'] = plot2.apply(lambda x: haversine_distance(row.latitude, row.longitude, x.latitude, x.longitude), axis=1)
        plot1.loc[index,'Min Haversine Distance'] = min(plot2['dist'])
    plot2.drop('dist', axis=1, inplace=True) # Delete the temporary column created
    return plot1

我会尝试这样做: 我希望有帮助

import pandas as pd
import numpy as np


df1 = pd.DataFrame(data={'lat': [1,2,3,4], 'lon': [5,6,7,8]})
df2 = pd.DataFrame(data={'lat': [9,10,11,12], 'lon': [13,14,15,16]})
df1['key'], df2['key'] = 1,1

df_c = pd.merge(df1, df2, on='key').drop('key', axis=1)

# below function is copied from: https://stackoverflow.com/a/43577275/4450090
def haversine(lat1, lon1, lat2, lon2, to_radians=True, earth_radius=6371):
    if to_radians:
        lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])

    a = np.sin((lat2-lat1)/2.0)**2 + \
        np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2

    return earth_radius * 2 * np.arcsin(np.sqrt(a))

df_c['dist'] = df_c.apply(lambda x: haversine(x['lat_x'], x['lon_x'], x['lat_y'], x['lon_y']), axis=1)
min_val = 1000000
df_c['dist'] = df_c['dist'].apply(lambda x: x if x < min_val else min_val)
将熊猫作为pd导入
将numpy作为np导入
df1=pd.DataFrame(数据={'lat':[1,2,3,4],'lon':[5,6,7,8]})
df2=pd.DataFrame(数据={'lat':[9,10,11,12],'lon':[13,14,15,16]})
df1['key'],df2['key']=1,1
df_c=pd.merge(df1,df2,on='key')。drop='key',axis=1)
#下面的函数是从中复制的:https://stackoverflow.com/a/43577275/4450090
def haversine(lat1、lon1、lat2、lon2至弧度=真,地球半径=6371):
如果到_弧度:
lat1,lon1,lat2,lon2=np弧度([lat1,lon1,lat2,lon2])
a=np.sin((lat2-lat1)/2.0)**2+\
np.cos(lat1)*np.cos(lat2)*np.sin((lon2-lon1)/2.0)**2
返回地球半径*2*np.Arcin(np.sqrt(a))
df_c['dist']=df_c.apply(λx:haversine(x['lat_x'],x['lon_x'],x['lat_y'],x['lon_y'],x['lon_y'],轴=1)
最小值=1000000
df_c['dist']=df_c['dist'].应用(如果x
以“我正试图将函数转换为lambda表达式,以尽量减少计算时间”为例等等。为什么你认为将其转换为lambda表达式会改善运行时?lambda函数没有什么特别之处,只是它们是匿名的,否则,它们就像其他任何函数一样。@juanpa.arrivillaga lambda表达式与常规循环相比确实有运行时改进,即使它们是匿名的如果可以使用矢量化或本机函数,这不是最好的选择。@Aryerez不,绝对不是。lambda只是一个匿名的普通函数。@juanpa.arrivillaga我说的是在
pandas apply
中使用lambda,而不是执行循环。在最后两行之前,您可能一直在使用lambda,但他想要的是fin对于
plot1
plot2
中的每一行,d表示与
plot2
中所有行之间的最小距离。您正在生成所有距离martix。使用此值而不是最后两行:
df_c=df_c.groupby(['lat_x',lon_x'])。min()['dist reset_index())
@NullByte我不知道确切的原因,但我运行这段代码时,我的电脑崩溃了。我认为这是在它合并数据帧时发生的。然而,数据帧的形状不同(所以我认为。合并不起作用)我还想用所有的plot2计算从plot1的每个点到plot2的距离,并取最小值。这可能是由于数据帧的形状。谢谢你的回答。这确实比我的函数快,但我需要将更多的计算时间减到最小。欢迎任何想法!@theo检查空字节答案,并附上我的第二条评论(如果他还没有编辑的话)。可能会更快。