【问题标题】:Compute pairwise element of two 1D array计算两个一维数组的成对元素
【发布时间】:2021-02-11 00:02:28
【问题描述】:

这是我的问题:

假设我的两个数组是:

import numpy as np
first = np.array(["hello", "hello", "hellllo"])
second = np.array(["hlo", "halo", "alle"])

现在我想得到两个数组的每个元素之间的距离矩阵

所以例如我的距离函数是:

def diff_len(string1, string2):
    return abs(len(string1) - len(string2))

所以我想得到矩阵:

        hello       hello    hellllo

hlo    result1     result2   result3
halo   result4     result5   result6
alle   result7     result8   result9

所以我所做的是使用 Numpy 的矢量化函数逐行计算:

vectorize_dist = np.vectorize(diff_len)

first = np.array(["hello", "hello", "hellllo"])
second = np.array(["hlo", "halo", "alle"])

vectorize_dist(first , "hlo")
vectorize_dist(first , "halo")
vectorize_dist(first , "alle")

matrix = np.array([vectorize_dist(first , "hlo"), vectorize_dist(first , "halo"), vectorize_dist(first , "alle")])
matrix

array([[2, 2, 4],
       [1, 1, 3],
       [1, 1, 3]])

但是为了得到我的矩阵,我需要执行一个循环来逐行计算,但我想一次得到矩阵。 事实上,我的两个数组可能非常大,执行循环可能会花费太多时间。 我还需要计算多个距离,因此我必须多次执行该过程,这将更加耗时。

【问题讨论】:

    标签: arrays python-3.x numpy vectorization pairwise


    【解决方案1】:

    您可以为此使用 SciPy 的 cdist

    import numpy as np
    from scipy.spatial.distance import cdist
    
    def diff_len(string1, string2):
        return abs(len(string1) - len(string2))
    
    first = np.array(["hello", "hello", "hellllo"])
    second = np.array(["hlo", "halo", "alle"])
    d = cdist(first[:, np.newaxis], second[:, np.newaxis], lambda a, b: diff_len(a[0], b[0]))
    print(d.T)
    # [[2. 2. 4.]
    #  [1. 1. 3.]
    #  [1. 1. 3.]]
    

    请注意,您需要将输出矩阵类型转换为整数。

    【讨论】:

    • 我有多个距离矩阵要计算,我可以使用多处理来利用我所有的核心来加速完整的计算吗?
    • @EnzoRamirezC。是的,应该可以这样做,例如使用多处理池,尽管它有开销,因此您是否可以获得显着的性能提升将取决于问题的大小。我也不确定cdist 之类的东西是否已经使用多个内核。您还可以探索并行 Numba(在这种情况下不使用 cdist,只使用循环),但要有效,您的代码需要原生 jit 可编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2018-12-13
    • 2015-12-26
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多