Dub*_*bon 4 python numpy inner-product
我有矢量a。
我想计算np.inner(a, a)
但是我不知道是否有更漂亮的方法来计算它。
[这种方式的缺点是,如果我想针对a-b一个或更复杂的表达式进行计算,则必须多做一行。c = a - b而np.inner(c, c)不是somewhat(a - b)]
老实说,可能没有比np.inneror更快的了np.dot。如果你觉得中间变量很烦人,你总是可以创建一个 lambda 函数:
sqeuclidean = lambda x: np.inner(x, x)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
np.linalg.norm(..., ord=2)在np.dot内部使用,并提供与np.inner直接使用非常相似的性能。
计算范数2
numpy.linalg.norm(x, ord=2)
Run Code Online (Sandbox Code Playgroud)
numpy.linalg.norm(x, ord=2)**2 对于广场
我不知道性能是否有任何好处,但(a**2).sum()计算出正确的值并具有您想要的非重复参数。您可以a用一些复杂的表达式替换而不将其绑定到变量,只需记住在必要时使用括号,因为**绑定比大多数其他运算符更紧密:((a-b)**2).sum()