的范数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