【问题标题】:Efficient way to compute distance matrix in NumPy在 NumPy 中计算距离矩阵的有效方法
【发布时间】:2018-11-30 04:53:35
【问题描述】:

我有这个示例数组:

In [38]: arr
Out[38]: array([  0,  44, 121, 154, 191])

以上只是一个示例,而我的实际数组大小非常大。 那么,计算距离矩阵的有效方法是什么?

结果应该是:

In [41]: res
Out[41]: 
array([[   0,   44,  121,  154,  191],
       [ -44,    0,   77,  110,  147],
       [-121,  -77,    0,   33,   70],
       [-154, -110,  -33,    0,   37],
       [-191, -147,  -70,  -37,    0]])

我写了一个基于for 循环的实现,它太慢了。出于效率原因,这是否可以矢量化?

【问题讨论】:

    标签: python arrays numpy multidimensional-array vectorization


    【解决方案1】:

    你可以使用broadcasting:

    from numpy import array
    
    arr = array([  0,  44, 121, 154, 191])
    arrM = arr.reshape(1, len(arr))
    res = arrM - arrM.T
    

    【讨论】:

    • arrM = arr.reshape(1, -1) 明确无误时,您可以随时使用
    【解决方案2】:

    subtract.outer,它有效地在两个数组之间执行广播减法。

    将 ufunc op 应用于 A 中的 a 和 B 中的 b 的所有对 (a, b)。

    令 M = A.ndim,N = B.ndim。那么op.outer(A, B) 的结果 C 是 一个维度为 M + N 的数组,这样:

    C[i_0, ..., i_{M-1}, j_0, ..., j_{N-1}] = 
         op(A[i_0, ..., i_{M-1}],B[j_0, ..., j_{N-1}])
    
    np.subtract.outer(arr, arr).T
    

    或者,

    arr - arr[:, None] # essentially the same thing as above
    

    array([[   0,   44,  121,  154,  191],
           [ -44,    0,   77,  110,  147],
           [-121,  -77,    0,   33,   70],
           [-154, -110,  -33,    0,   37],
           [-191, -147,  -70,  -37,    0]])
    

    【讨论】:

    • @kmario23 这是同一个 ufunc 的广播版本。我添加了一个链接,如果它仍然没有意义,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-05-08
    相关资源
    最近更新 更多