如何解决使用Python中的一个列表理解来找到两列中的点列表之间的距离
我需要创建一列,该列由代表点之间距离的列表列表组成。我试图以一种列表理解或最有效的方式来创建距离列表。
这是起始数据帧linkerd --help
df
这是我想要的结尾ID list_1 list_2
00 [(10,2),(5,7)] [(11,3),(9,9)]
01 [(1,7)] [(9,1)(2,1),(6,3)]
02 [(4,4)] [(3,7)]
数据帧。本质上,对于每一行,列df
中的每个元组都需要找到其自身与列list_2
中的每个元组之间的距离。
list_1
在达到最终目标之前,我最终进行了六次列表理解,但是我确信还有一种更有效的方法。
我在做什么:
ID list_1 list_2 distances
00 [(10,9)] [[1.41,7.21],[7.07,4.47]]
01 [(1,1)] [[10.0,6.08]]
第1步
import pandas as pd
import math
第2步
df['x'] = [[s[1] for s in object_slice] for object_slice in df['list_1']]
第3步
df['y'] = [[s[1] for s in object_slice] for object_slice in df['list_1']]
第4步
df['dist_p1'] = [[(df['x'][a] - s[1],df['y'][a] - s[0]) for s in object_slice]for a,object_slice in enumerate(df['list_2'])]
第5步
df['dist_p2'] = [[s[0] for s in object_slice] for object_slice in df['dist_p1']]
步骤6
df['dist_p3'] = [[s[1] for s in object_slice] for object_slice in df['dist_p1']]
解决方法
OP:
您的原始代码在步骤3中抛出错误,因此我无法重现您的结果。
但是,示例结果中的行00
和行01
之间的计算逻辑似乎不一致。
因为:
在00
行中,
[[1.41,7.21],[7.07,4.47]]=[[distance((11,3),(10,2)),distance((11,3)(5,7))],[distance((9,9),distance((9,(5,7))]]
这里list_2
是外部循环,list_1
是内部循环。
但是在01
行中,
[[10.0,6.08]] = [[distance((1,7),(9,1)),distance((1,(2,1))]]
这里list_1
是外部循环,list_2
是内部循环。
换句话说,示例结果中的行00
和行01
的嵌套循环逻辑顺序是不同的。
但是,如果使用list_1
作为外部循环,这就是我要做的事情。
df['distances']=df.apply(lambda row:[[round(math.hypot(i[0]-j[0],i[1]-j[1]),2) for j in row['list_2']] for i in row['list_1']],axis=1)
返回:
list_1 list_2 distances
0 [(10,2),7)] [(11,9)] [[1.41,7.07],[7.21,4.47]]
1 [(1,7)] [(9,1),1)] [[10.0,6.08]]
如果您需要使用list_2
作为外部循环,则只需在list_1
函数中交换list_2
和lambda
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。