下面的代码完全符合我的要求,即计算向量元素之间差值的成对平方和(示例中长度为 3),我有一个很长的系列(这里限制为五个)。所需的结果显示在底部。 但由于两个原因,实现感觉很糟糕:
1) 需要添加一个幻象维度,将形状从(5, 3) 更改为(5,1,3) 以避免广播问题,以及
2) 显式“for”循环的明显必要性,我确信这就是为什么在我更大的数据集(一百万个长度为 2904 的向量)上执行需要花费数小时的原因。
是否有更有效和/或 Pythonic 的方法来实现相同的结果?
a = np.array([[ 4, 2, 3], [-1, -5, 4], [ 2, 1, 4], [-5, -1, 4], [6, -3, 3]])
a = a.reshape((5,1,3))
m = a.shape[0]
n = a.shape[2]
d = np.zeros((n,n))
for i in range(m):
c = a[i,:] - np.transpose(a[i,:])
c = c**2
d += c
print d
[[ 0. 118. 120.]
[ 118. 0. 152.]
[ 120. 152. 0.]]
最佳答案
如果您不介意对scipy
的依赖,您可以使用scipy.spatial.distance
中的函数图书馆:
In [17]: from scipy.spatial.distance import pdist, squareform
In [18]: a = np.array([[ 4, 2, 3], [-1, -5, 4], [ 2, 1, 4], [-5, -1, 4], [6, -3, 3]])
In [19]: d = pdist(a.T, metric='sqeuclidean')
In [20]: d
Out[20]: array([ 118., 120., 152.])
In [21]: squareform(d)
Out[21]:
array([[ 0., 118., 120.],
[ 118., 0., 152.],
[ 120., 152., 0.]])
关于python - 成对平方差的高效 Numpy 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415061/