在Python中加速列表处理

3

我有两个列表list1list2,每个列表的大小都是5000,并且列表中的每个条目都是一个numpy.array。我想以快速高效的方式计算列表元素之间欧几里得距离的平方,即需要计算每个i和j组合的sum((list1[i]-list2[j])**2),总共有250万种组合。我目前通过运行双重循环并通过使用2Dnumpy.array将每个结果写入其中来实现这一点。

result[i,j] = sum((list1[i]-list2[j])**2) 

但在我的电脑上仍需要大约4分钟的时间。我想知道是否有任何技巧可以进一步加快计算速度。


3
i和j之间的距离与j和i之间的距离相同。通过使用从外部索引开始的内部循环,可以缩短一半的时间。 - Jean-François Fabre
4
你为什么要使用数组列表?如果使用2D数组和scipy.spatial.distance.cdist之类的工具,速度会更快。 - user2357112
3
从scipy.spatial导入distance_matrix; dist_mat = distance_matrix(list1, list2) - Quang Hoang
组件数组的形状都相同吗?都是一维的吗? - hpaulj
如果每个列表中的所有数组形状相同,那么简单的广播应该就可以解决问题了。 - Mercury
1个回答

1
如果您坚持使用numpy(假设您的内部数组是1-D):
dist_mat = ((list1[:,None,:]-list2[:,:])**2).sum(2)

请注意,根据您在问题中定义的距离,这是欧氏距离的平方。如果您想要距离本身,请将其平方根。
否则,我更喜欢@Quang的评论:
from scipy.spatial import distance_matrix
dist_mat = distance_matrix(list1, list2)

非常感谢,大家的回复都非常好!特别是scipy函数大大加快了距离矩阵的计算速度。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接