[英]Compute square distances from numpy array
我正在腦力衰竭,但我無法讓它發揮作用。 我有一系列的距離:
import numpy as np
zvals = np.linspace(-5,5,10)
d = np.array([(0,0,z) for z in zvals])
我想計算數組中點的平方距離。 實現這項工作的非笨拙方式是:
d2 = np.array([np.dot(d[i,:],d[i,:]) for i in range(d.shape[0])])
但是,我知道必須有一些方法可以通過一次調用dot來做到這一點,對吧? 話既然說,也沒有
d2 = np.dot(d,d.T)
要么
d2 = np.dot(d.T,d)
給我想要的東西。 我意識到,我是傻瓜,但請在這里賜教。 謝謝!
編輯:從NumPy 1.9開始,看起來inner1d可能會更快。 (感謝Nuno Aniceto指出這一點):
In [9]: %timeit -n 1000000 inner1d(d,d)
1000000 loops, best of 3: 1.39 µs per loop
In [14]: %timeit -n 1000000 einsum('ij,ij -> i', d, d)
1000000 loops, best of 3: 1.8 µs per loop
PS。 始終在類似於您的預期用例的輸入上測試您自己的基准。 結果可能因各種原因而有所不同,例如輸入大小,硬件,操作系統,Python版本,NumPy版本,編譯器和庫(例如ATLAS,MKL,BLAS)。
如果你有NumPy 1.6或更高版本,你可以使用np.einsum :
In [40]: %timeit np.einsum('ij,ij -> i', d, d)
1000000 loops, best of 3: 1.79 us per loop
In [46]: from numpy.core.umath_tests import inner1d
In [48]: %timeit inner1d(d, d)
100000 loops, best of 3: 1.97 us per loop
In [44]: %timeit np.sum(d*d, axis=1)
100000 loops, best of 3: 5.39 us per loop
In [41]: %timeit np.diag(np.dot(d,d.T))
100000 loops, best of 3: 7.2 us per loop
In [42]: %timeit np.array([np.dot(d[i,:],d[i,:]) for i in range(d.shape[0])])
10000 loops, best of 3: 26.1 us per loop
點產品功能非常快,對於非常簡單的東西甚至可能擊敗np.einsum
(這是一個非常好的功能,你應該學習使用)。 Numpy有一個隱藏的小寶石, inner1d
,它通過廣播,在其參數的最后一個維度上做點積。 您可以按如下方式使用它:
from numpy.core.umath_tests import inner1d
inner1d(a, a)
我不確定是否有一種簡潔的方法將普通的點積方法插入更大的數組中。 相反,我通常做:
d2 = n.sum(d*d,axis=1)
d * d當然是標准點積運算,因為它只是數組中所有條目的元素乘法。 axis=1
參數沿第二軸總和(水平,當打印數組時),這是點積運算的第二部分。
編輯:此外,忽略方法的一般不受歡迎程度,你的行
d2 = np.array([np.dot(d[i,:],d[i,:]) for i in range(d.shape[0])])
可以簡單
d2 = np.array([np.dot(row,row) for row in d])
當使用'for in array'語法時,numpy數組返回行而不是單個矩陣條目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.