[英]Perform element-wise subtract from the vector
我需要从以下等式计算向量中元素减去的总和:
sum(y(i) - y(j)) at i!=j
y 以 numpy 数组的形式给出
一种选择是遍历双循环:
dev = 0
for i in range(y.shape[0]):
for j in range(y.shape[0]):
if i == j:
continue
dev += y[i, j] - y[i, j]
这绝对不是最佳解决方案。
如何使用带有 numpy 向量的向量化操作对其进行优化?
假设y
是平坦的,例如
>>> y = np.arange(10)
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> y.shape
(10,)
您可以按如下方式计算“笛卡尔差异”
>>> m = np.abs(y[:, None] - y[None, :])
>>> m
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 0, 1, 2, 3, 4, 5, 6, 7, 8],
[2, 1, 0, 1, 2, 3, 4, 5, 6, 7],
[3, 2, 1, 0, 1, 2, 3, 4, 5, 6],
[4, 3, 2, 1, 0, 1, 2, 3, 4, 5],
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4],
[6, 5, 4, 3, 2, 1, 0, 1, 2, 3],
[7, 6, 5, 4, 3, 2, 1, 0, 1, 2],
[8, 7, 6, 5, 4, 3, 2, 1, 0, 1],
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]])
最后
>>> dev = m.sum()/2
>>> dev
165.0
使用itertools
combination
:
import itertools
sum([x2 - x1 for x1, x2 in itertools.combinations(y, 2)])
使用np.subtract.outer
np.abs(np.subtract.outer(y,y)).sum()/2
方法1(使用Itertools):
挂壁时间:18.9 秒
方法2(使用KeepAlive的笛卡尔差):
挂墙时间:491 毫秒
方法 3(使用 np.subtract.outer):
挂墙时间:467 毫秒
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.