簡體   English   中英

從向量中執行逐元素減法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM