python 3如何在numpy linalg norm中使用多线程

时间:2019-05-22 16:21:50

标签: python python-3.x multithreading numpy linear-algebra

我正在将python3与np.linalg.norm一起用于计算矩阵(norm(axis = 1))中的行的范数,是否有一种简单的方法,仅使用np使其通过多线程或多芯运行?

1 个答案:

答案 0 :(得分:1)

我们可以使用支持多核处理的numexpr module-

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])