In [1]: import numpy as np
In [2]: a = np.arange(1200.0).reshape((-1,3))
In [3]: %timeit [np.linalg.norm(x) for x in a]
100 loops, best of 3: 3.86 ms per loop
In [4]: %timeit np.sqrt((a*a).sum(axis=1))
100000 loops, best of 3: 15.6 µs per loop
In [5]: %timeit np.sqrt(np.einsum('ij,ij->i',a,a))
100000 loops, best of 3: 8.71 µs per loop
或向量:
In [5]: a = np.arange(100000)
In [6]: %timeit np.sqrt(a.dot(a))
10000 loops, best of 3: 80.8 µs per loop
In [7]: %timeit np.sqrt(np.einsum('i,i', a, a))
10000 loops, best of 3: 60.6 µs per loop
但是,调用它似乎会带来一些开销,这可能会使它在小输入时变慢:
In [2]: a = np.arange(100)
In [3]: %timeit np.sqrt(a.dot(a))
100000 loops, best of 3: 3.73 µs per loop
In [4]: %timeit np.sqrt(np.einsum('i,i', a, a))
100000 loops, best of 3: 4.68 µs per loop
>>> import timeit
>>> timeit.timeit('np.linalg.norm(x)', setup='import numpy as np; x = np.arange(100)', number=1000)
0.0450878
>>> timeit.timeit('np.sqrt(x.dot(x))', setup='import numpy as np; x = np.arange(100)', number=1000)
0.0181372
编辑:真正的速度提高是当你必须采取许多向量的规范。使用纯numpy函数不需要任何for循环。例如:
In [1]: import numpy as np
In [2]: a = np.arange(1200.0).reshape((-1,3))
In [3]: %timeit [np.linalg.norm(x) for x in a]
100 loops, best of 3: 4.23 ms per loop
In [4]: %timeit np.sqrt((a*a).sum(axis=1))
100000 loops, best of 3: 18.9 us per loop
In [5]: np.allclose([np.linalg.norm(x) for x in a],np.sqrt((a*a).sum(axis=1)))
Out[5]: True
另一种选择是在numpy中为任意一个数组使用
einsum
函数:或向量:
但是,调用它似乎会带来一些开销,这可能会使它在小输入时变慢:
你要找的函数是^{} 。(我认为它应该在基numpy中作为数组的一个属性——比如
x.norm()
——但是哦,好吧)。您还可以输入一个可选的
ord
作为所需的n阶范数。假设你想要一个标准:等等。
如果你担心速度,你应该使用:
以下是一些基准:
编辑:真正的速度提高是当你必须采取许多向量的规范。使用纯numpy函数不需要任何for循环。例如:
相关问题 更多 >
编程相关推荐