2016-02-04 77 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