簡體   English   中英

計算向量中所有條目組合之間的差異

[英]calculate difference between all combinations of entries in a vector

我有一個 numpy 一維 z 值數組,我想計算所有條目組合之間的差異,輸出為方陣。

我知道如何使用 cdist 將其計算為所有點組合之間的距離,但這並沒有給我這個符號:

例如,如果我的 z 向量是 [1,5,8]

import numpy as np
from scipy.spatial.distance import cdist

z=np.array([1, 5, 8])
z2=np.column_stack((z,np.zeros(3)))
cdist(z2,z2)

給我:

array([[0., 4., 7.],
       [4., 0., 3.],
       [7., 3., 0.]])

但我想有跡象給我:

array([[0., 4., 7.],
       [-4., 0., 3.],
       [-7., -3., 0.]])

我想通過使用 np.tril_indices 來翻轉下三角形的符號來捏造事情,但這不起作用,因為我需要以一致的方式對我的操作進行區分(即,如果我在兩個或更多的向量,這些對總是以相同的順序進行比較),而通過翻轉符號 I 將始終在右上角有正差,在左下角有負差。

使用 numpy 數組廣播的簡單單行解決方案。

import numpy as np

z = np.array([1, 5, 8])
# Simple one line solution
z - z.reshape(-1,1)

輸出

array([[ 0,  4,  7],
       [-4,  0,  3],
       [-7, -3,  0]])
In [29]: z = np.array([1, 5, 8])                                                                                                                                                                     

In [30]: -np.subtract.outer(z, z)                                                                                                                                                                    
Out[30]: 
array([[ 0,  4,  7],
       [-4,  0,  3],
       [-7, -3,  0]])

(如果您不關心符號約定,請刪除減號。)

我已經計算出我可以用雙迭代器得到我想要的答案,盡管我不確定它對於非常大的數組是最有效的

np.array([j-i for i in z for j in z]).reshape(len(z),len(z))

輸出:

array([[ 0,  4,  7],
   [-4,  0,  3],
   [-7, -3,  0]])

編輯:所以確實其他兩個解決方案快了大約 50 倍:

python3 -m timeit -s "import numpy as np" -s "z=np.random.uniform(size=5000)" "z-z.reshape(-1,1)"
2 loops, best of 5: 119 msec per loop

python3 -m timeit -s "import numpy as np" -s "z=np.random.uniform(size=5000)" "np.subtract.outer(z, z)"
2 loops, best of 5: 118 msec per loop

python3 -m timeit -s "import numpy as np" -s "z=np.random.uniform(size=5000)" "np.array([j-i for i in z for j in z]).reshape(len(z),len(z))"
1 loop, best of 5: 5.18 sec per loop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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