微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从向量中执行逐元素减法

如何解决从向量中执行逐元素减法

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

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?