如何将numpy.linalg.norm应用于矩阵的每一行?

我有一个2D矩阵,我想取每一行的范数。但是当我直接使用numpy.linalg.norm(X)时,它取整个矩阵的范数

我可以通过使用for循环获取每一行的范数,然后获取每一行的范数X[I],但这需要花费大量时间,因为我有3万行

有什么建议可以找到更快的方法吗?或者可以对矩阵的每一行应用np.linalg.norm

对于numpy 1.9+

请注意,如心周肌所示,从NumPy版本1.9开始,np.linalg.norm(x,axis=1)是计算L2范数的最快方法

对于numpy<1.9

如果要计算L2范数,可以直接计算它(使用axis=-1参数沿行求和):

np.sum(np.abs(x)**2,轴=-1)**(1./2)

当然,Lp范数也可以类似地计算

它比np快得多。沿轴应用,尽管可能不那么方便:

[48]on

:%timeit np.沿轴应用(np.linalg.norm,1,x)
1000圈,最好3圈:每圈208美元
At[49]:%timeit np.sum(np.abs(x)**2,axis=-1)**(1./2)
100000个回路,最好的3个:每个回路18.3 us

其他ord形式的norm也可以直接计算(具有类似的加速比):

[55]on

:%timeit np.沿轴应用(lambda行:np.linalg.norm(行,ord=1),1,x)
1000圈,最好的3圈:203美元/圈
At[54]on:%timeit np.sum(abs(x),axis=-1)
100000个回路,最好3个:每个回路10.9 us

发表评论