以下代码完美地实现了我想要的功能,即计算向量元素之间差的平方和(示例中长度为三),而我有一系列这样的向量(此处限制为五个)。期望结果显示在底部。
但是,实现感觉有两个问题:
1)需要添加虚拟维度,将形状从(5,3)更改为(5,1,3),以避免广播问题;
2)明显需要一个显式的 'for' 循环,这就是为什么在我的更大数据集上执行需要几个小时的原因(一百万个长度为2904的向量)。
是否有更有效和/或更符合Python风格的方法来实现相同的结果?
1)需要添加虚拟维度,将形状从(5,3)更改为(5,1,3),以避免广播问题;
2)明显需要一个显式的 'for' 循环,这就是为什么在我的更大数据集上执行需要几个小时的原因(一百万个长度为2904的向量)。
是否有更有效和/或更符合Python风格的方法来实现相同的结果?
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.]]
n
个点,需要计算n*(n-1)/2
个成对距离。因此,除非您可以分块处理(并且可以在计算下一块之前丢弃一块),否则您的内存需求为O(n^2)。pdist
将在内存中创建此数组。如果要分块处理和/或直接将计算结果写入内存映射数组,则最好从@unutbu的答案开始。 - Warren Weckesser