In [48]: %timeit np.apply_along_axis(np.linalg.norm, 1, x)
1000 loops, best of 3: 208 us per loop
In [49]: %timeit np.sum(np.abs(x)**2,axis=-1)**(1./2)
100000 loops, best of 3: 18.3 us per loop
norm的其他ord形式也可以直接计算(具有类似的加速比):
In [55]: %timeit np.apply_along_axis(lambda row:np.linalg.norm(row,ord=1), 1, x)
1000 loops, best of 3: 203 us per loop
In [54]: %timeit np.sum(abs(x), axis=-1)
100000 loops, best of 3: 10.9 us per loop
In [10]: x = np.random.random((500,500))
In [11]: %timeit np.apply_along_axis(np.linalg.norm, 1, x)
10 loops, best of 3: 21 ms per loop
In [12]: %timeit np.sum(np.abs(x)**2,axis=-1)**(1./2)
100 loops, best of 3: 2.6 ms per loop
In [13]: %timeit np.linalg.norm(x, axis=1)
1000 loops, best of 3: 1.4 ms per loop
为了证明它在计算同样的东西:
In [14]: np.allclose(np.linalg.norm(x, axis=1), np.sum(np.abs(x)**2,axis=-1)**(1./2))
Out[14]: True
5条答案
按热度按时间ht4b089n1#
对于numpy 1.9+
请注意,perimosocordiae shows,从NumPy版本1.9开始,
np.linalg.norm(x, axis=1)
是计算L2范数的最快方法。对于numpy < 1.9
如果你正在计算L2范数,你可以直接计算它(使用
axis=-1
参数沿着行求和):当然,Lp范数也可以类似地计算。
它比
np.apply_along_axis
快得多,尽管可能没有那么方便:norm
的其他ord
形式也可以直接计算(具有类似的加速比):ercv8c1e2#
由于numpy更新而重新提出旧问题。从1.9版本开始,
numpy.linalg.norm
现在接受axis
参数。[ code,documentation ]这是城里最快的方法:
为了证明它在计算同样的东西:
093gszye3#
比公认的答案快得多的是使用NumPy的einsum,
比这更快的是排列数据,以便跨所有 * 列 * 计算范数,
注意对数标度:
用于重现绘图的代码:
0s7z1bwu4#
尝试以下操作:
其中
a
是2D数组。上面计算L2范数。对于不同的规范,您可以使用以下内容:
qyuhtwio5#
就像这样简单,当你的2D numpy数组是
x
时: