从向量中执行逐元素减法

问题描述

我需要计算从以下等式中的向量减去元素的总和:

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 毫秒

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...