在NumPy中计算距离矩阵的有效方法

时间:2018-06-21 00:09:23

标签: python arrays numpy multidimensional-array vectorization

我有这个样本数组:

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的循环,实在太慢了。出于效率考虑,可以将其向量化吗?

2 个答案:

答案 0 :(得分:2)

您可以使用broadcasting

from numpy import array

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

答案 1 :(得分:1)

subtractouter,可以有效地执行两个数组之间的广播减法。

  

将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]])