如何解决从向量中执行逐元素减法
我需要计算从以下等式中的向量减去元素的总和:
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,9],[1,8],[2,7],[3,6],[4,5],[5,4],[6,3],[7,2],[8,1],[9,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 毫秒
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。