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
其他ord形式的norm也可以直接计算(具有类似的加速比):
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
注意,作为perimosocordiae shows,从NumPy版本1.9开始,
np.linalg.norm(x, axis=1)
是计算二级规范的最快方法。如果要计算二级规范,可以直接计算(使用
axis=-1
参数沿行求和):当然,Lp范数也可以类似地计算。
它比
np.apply_along_axis
快得多,尽管可能不太方便:其他
ord
形式的norm
也可以直接计算(具有类似的加速比):由于numpy更新而复活旧问题。从1.9版本开始,
numpy.linalg.norm
现在接受一个axis
参数。[code,documentation]这是城里最快的新方法:
为了证明它在计算同样的东西:
比公认的答案快得多
注意对数刻度:
复制绘图的代码:
相关问题 更多 >
编程相关推荐