【问题标题】:Finding distance between elements of two different list查找两个不同列表的元素之间的距离
【发布时间】:2018-09-04 17:51:01
【问题描述】:

下面的代码找出列表 a 的每个元素与列表 b 的每个元素之间的欧几里得距离。

from scipy.spatial import distance
a = [[1, 2, 3], [4, 5, 6]]
b = [[10, 20]]

Final_distance = []
for i in [j for sub in a for j in sub]:
    for k in [m for t in b for m in t]:
        dist = distance.euclidean(i, k)
        Final_distance.append(dist)
print(Final_distance)

输出是

[9.0, 19.0, 8.0, 18.0, 7.0, 17.0, 6.0, 16.0, 5.0, 15.0, 4.0, 14.0]

但是对于非常大的列表,它需要很长时间。有没有办法降低上述代码的时间复杂度?

【问题讨论】:

    标签: python scipy euclidean-distance


    【解决方案1】:

    由于您的欧几里得距离是标量,因此它相当于每个点之间的绝对值。因此,您可以使用np.repeat 和np.tile 以适当的顺序重复您的数组,然后将您的数组彼此相减:

    import numpy as np
    
    a = [[1, 2, 3], [4, 5, 6]]
    b = [[10, 20]]
    
    a1 = np.array(a).flatten()
    b1 = np.array(b).flatten()
    
    Final_distance = np.abs(np.subtract(np.repeat(a1, len(b1)), np.tile(b1, len(a1))))
    

    返回:

    array([ 9, 19,  8, 18,  7, 17,  6, 16,  5, 15,  4, 14])
    

    【讨论】:

    • 感谢您的回答。这比我的方法快得多。但是对于非常大的 a 和 b,即如果 a 包含 10000 个列表,b 包含 2000 个列表,那么这种方法可能会带来内存问题,导致内存错误。
    猜你喜欢
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多