python - 成对平方差的高效 Numpy 计算

标签 python arrays numpy

下面的代码完全符合我的要求,即计算向量元素之间差值的成对平方和(示例中长度为 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/

相关文章:

javascript - 给定日期字符串的关联数组,找到下一个最接近的日期

python - 用 SVD 分解求解线性方程组

python - 皮威 ORM : how to efficiently iterate over a large resultset

Python PULP 数组乘法约束

python - python 中浮点精度的损失

javascript - 如何连接数组中同一元素的多个属性?

php - 将MySQL数据放入数组中

python - Python numpy 中缺失值的奇怪计时

python - 有没有办法在数组列表中找到唯一二进制数组的计数?

python - DataFrame 到列表的列表而不更改值的数据类型