的範數2的平方餘有矢量a
。
我想計算np.inner(a, a)
但我不知道是否有更漂亮些calc下它的方式。numpy的計算矢量
[這種方式的缺點是,如果我想計算它爲a-b
或更復雜的表達式,我必須再做一行。 c = a - b
和np.inner(c, c)
代替somewhat(a - b)
]
的範數2的平方餘有矢量a
。
我想計算np.inner(a, a)
但我不知道是否有更漂亮些calc下它的方式。numpy的計算矢量
[這種方式的缺點是,如果我想計算它爲a-b
或更復雜的表達式,我必須再做一行。 c = a - b
和np.inner(c, c)
代替somewhat(a - b)
]
老實說還有的可能不會是任何快於np.inner
或np.dot
。如果你發現中間變量煩人,你總是可以創建一個lambda函數:
sqeuclidean = lambda x: np.inner(x, x)
np.inner
和np.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
。
計算NORM2
numpy.linalg.norm(x, ord=2)
numpy.linalg.norm(x, ord=2)**2
方形
我不知道如果表現任何好處,但(a**2).sum()
計算權值並具有非 - 你想要的重複的論點。您可以替換a
一些複雜的表達式不綁定到一個變量,只記得用括號作爲必要的,因爲**
結合比大部分其他運營商更緊密地:((a-b)**2).sum()
我認爲顯然是有專門的辦法做到這一點,但現在看來,這是最好的方式。 – Dubon
我知道的解決方案,但它運行時的價格。 – Dubon
你測試過了嗎? @Dubon – Farseer
沒有,但爲什麼做平方根,如果你以後方呢? – Dubon