2
A
回答
1
您可以使用的有效np.einsum
-
subs = new_v - val[:,None]
out = np.sqrt(np.einsum('ij,ij->j',subs,subs))
或者,使用(a-b)^2 = a^2 + b^2 - 2ab
式 -
out = np.sqrt(np.einsum('ij,ij->j',new_v, new_v) + val.dot(val) - 2*val.dot(new_v))
如果new_v
第二軸是一個大的,我們也numexpr
模塊可以以最後計算sqrt
部分。
運行測試
途徑 -
import numexpr as ne
def einsum_based(new_v, val):
subs = new_v - val[:,None]
return np.sqrt(np.einsum('ij,ij->j',subs,subs))
def dot_based(new_v, val):
return np.sqrt(np.einsum('ij,ij->j',new_v, new_v) + \
val.dot(val) - 2*val.dot(new_v))
def einsum_numexpr_based(new_v, val):
subs = new_v - val[:,None]
sq_dists = np.einsum('ij,ij->j',subs,subs)
return ne.evaluate('sqrt(sq_dists)')
def dot_numexpr_based(new_v, val):
sq_dists = np.einsum('ij,ij->j',new_v, new_v) + val.dot(val) - 2*val.dot(new_v)
return ne.evaluate('sqrt(sq_dists)')
計時 -
In [85]: # Inputs
...: new_v = np.random.randint(0,9,(10,100000))
...: val = np.random.randint(0,9,(10))
In [86]: %timeit np.sqrt(np.sum(np.square(new_v-val.reshape(10,1)),axis=0))
...: %timeit einsum_based(new_v, val)
...: %timeit dot_based(new_v, val)
...: %timeit einsum_numexpr_based(new_v, val)
...: %timeit dot_numexpr_based(new_v, val)
...:
100 loops, best of 3: 2.91 ms per loop
100 loops, best of 3: 2.1 ms per loop
100 loops, best of 3: 2.12 ms per loop
100 loops, best of 3: 2.26 ms per loop
100 loops, best of 3: 2.43 ms per loop
In [87]: from numpy.linalg import norm
# @wim's solution
In [88]: %timeit norm(new_v.T-val, axis=1, ord=2)
100 loops, best of 3: 5.88 ms per loop
1
你有什麼是正確的。 numpy.linalg
有一個更簡單的方法:
from numpy.linalg import norm
norm(new_v.T-val, axis=1, ord=2)
相關問題
- 1. Scipy稀疏矩陣和稀疏矢量之間的歐幾里德距離
- 2. 歐幾里德距離c#
- 3. 歐幾里德距離點
- 4. 兩個向量之間的歐幾里得距離(單行矩陣)
- 5. 查找兩個巨大CSR矩陣的行之間的歐幾里德距離
- 6. 計算2個矩陣之間的歐幾里德距離在CUDA
- 7. Tensorflow - 矩陣中歐幾里德距離的點
- 8. 稀疏向量中的歐幾里得距離與餘弦距離 - 歐幾里德如何表現更好?
- 9. Python Scipy和Networkx:如何計算歐幾里德距離矩陣?
- 10. 使用big.matrix對象計算歐幾里德距離矩陣
- 11. 兩列向量之間的歐幾里得距離Matlab
- 12. MATLAB:向量化補丁之間的歐幾里得距離
- 13. 使用OpenCL的歐幾里德距離
- 14. csv文件的歐幾里德距離
- 15. 使用歐幾里德距離度量查詢距離
- 16. std :: transform向量爲歐幾里德距離
- 17. 3D向量加速歐幾里德距離
- 18. 計算平方歐幾里德距離
- 19. 歐幾里德距離定義
- 20. 歐幾里德距離數學錯誤
- 21. 歐幾里德距離遞歸函數
- 22. 使用CUDA計算矩陣的相應行之間的歐幾里得距離
- 23. 用於測量圖像中像素之間歐幾里德距離的算法
- 24. 向量空間模型:餘弦相似度vs歐幾里德距離
- 25. 馬哈拉諾比斯距離VS歐幾里德距離在矢量量化
- 26. 歐幾里得距離的python數據幀矩陣
- 27. Tensorflow中的歐幾里得距離,轉換矩陣
- 28. 如何計算存儲在兩個單獨矩陣的行中的兩點之間的歐幾里德距離?
- 29. 從matlab中給出的歐幾里得距離矩陣的鄰接矩陣
- 30. 歐幾里得距離
'new_v'的形狀是什麼? – Divakar
據推測,它是任意n的「(10,n)」。 – wim
典型的'n'值會激發我們有一些時間:) – Divakar