i使用python3与np.linalg.norm一起计算矩阵中的行(norm(axis = 1((它使用多线程或多层架运行?
我们可以使用支持多核处理的numexpr
模块,例如So-
import numexpr as ne
def linalg_norm(a):
sq_norm = ne.evaluate('sum(a**2,1)')
return ne.evaluate('sqrt(sq_norm)')
要沿任何其他轴执行规范还原,请在评估表达式中将1
替换为该轴号-'sum(a**2,1)'
。
样本运行 -
In [34]: np.random.seed(0)
...: a = np.random.rand(4,5)
In [35]: np.linalg.norm(a,axis=1)
Out[35]: array([1.28545589, 1.57467272, 1.4460319 , 1.43656019])
In [36]: linalg_norm(a)
Out[36]: array([1.28545589, 1.57467272, 1.4460319 , 1.43656019])
Related post
如何控制多核功能。
对于完整性,很少提出任何替代方案。
有效的解决方案是np.einsum
-
In [39]: np.sqrt(np.einsum('ij,ij->i',a, a))
Out[39]: array([1.28545589, 1.57467272, 1.4460319 , 1.43656019])
使用np.matmul/@ operator on Python 3.x
-
In [6]: np.sqrt(np.matmul(a[:,None],a[:,:,None])[:,0,0])
Out[6]: array([1.28545589, 1.57467272, 1.4460319 , 1.43656019])
In [7]: np.sqrt((a[:,None] @ a[:,:,None])[:,0,0])
Out[7]: array([1.28545589, 1.57467272, 1.4460319 , 1.43656019])