我有这个样本数组:
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
的循环,实在太慢了。出于效率考虑,可以将其向量化吗?
答案 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)
有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]])