2016-02-04 74 views
3

的範數2的平方餘有矢量a
我想計算np.inner(a, a)
但我不知道是否有更漂亮些calc下它的方式。numpy的計算矢量

[這種方式的缺點是,如果我想計算它爲a-b或更復雜的表達式,我必須再做一行。 c = a - bnp.inner(c, c)代替somewhat(a - b)]

回答

2

老實說還有的可能不會是任何快於np.innernp.dot。如果你發現中間變量煩人,你總是可以創建一個lambda函數:

sqeuclidean = lambda x: np.inner(x, x) 

np.innernp.dot槓桿BLAS例程,而且幾乎肯定將超過標準的按元素相乘,然後求和更快。

In [1]: %%timeit -n 1 -r 100 a, b = np.random.randn(2, 1000000) 
((a - b) ** 2).sum() 
    ....: 
The slowest run took 36.13 times longer than the fastest. This could mean that an intermediate result is being cached 
1 loops, best of 100: 6.45 ms per loop 

In [2]: %%timeit -n 1 -r 100 a, b = np.random.randn(2, 1000000)                                            
np.linalg.norm(a - b, ord=2) ** 2 
    ....: 
1 loops, best of 100: 2.74 ms per loop 

In [3]: %%timeit -n 1 -r 100 a, b = np.random.randn(2, 1000000) 
sqeuclidean(a - b) 
    ....: 
1 loops, best of 100: 2.64 ms per loop 

np.linalg.norm(..., ord=2)使用np.dot內部,並給出了非常相似的性能,直接使用np.inner

1

計算NORM2

numpy.linalg.norm(x, ord=2) 

numpy.linalg.norm(x, ord=2)**2方形

+1

我知道的解決方案,但它運行時的價格。 – Dubon

+1

你測試過了嗎? @Dubon – Farseer

+0

沒有,但爲什麼做平方根,如果你以後方呢? – Dubon

2

我不知道如果表現任何好處,但(a**2).sum()計算權值並具有非 - 你想要的重複的論點。您可以替換a一些複雜的表達式不綁定到一個變量,只記得用括號作爲必要的,因爲**結合比大部分其他運營商更緊密地:((a-b)**2).sum()

+0

我認爲顯然是有專門的辦法做到這一點,但現在看來,這是最好的方式。 – Dubon