Python 计算负矩阵sqrt的内存有效方法
我需要计算一个有正数和负数的大矩阵的sqrt。问题是因为sqrt对符号很敏感。所以我使用下面的代码Python 计算负矩阵sqrt的内存有效方法,python,performance,numpy,sqrt,Python,Performance,Numpy,Sqrt,我需要计算一个有正数和负数的大矩阵的sqrt。问题是因为sqrt对符号很敏感。所以我使用下面的代码 neg=numpy.argwhere(temp<0) temp=numpy.abs(temp) temp=numpy.sqrt(temp) temp[neg]=-temp[neg] neg=numpy.argwhere(tempnumpy“where”是解决您的问题的合适选择,请尝试以下代码: result = numpy.where(a>=0, numpy.sqrt(a), -nu
neg=numpy.argwhere(temp<0)
temp=numpy.abs(temp)
temp=numpy.sqrt(temp)
temp[neg]=-temp[neg]
neg=numpy.argwhere(tempnumpy“where”是解决您的问题的合适选择,请尝试以下代码:
result = numpy.where(a>=0, numpy.sqrt(a), -numpy.sqrt(-a))
这行代码返回矩阵中数字的sqrt(如果为正或为零),否则返回负sqrt的负数。在处理大数据时,如果预期操作可以表示为算术操作,我们还可以使用支持多核处理的。警告是,我们需要使用算术向量化运算符所以,我们问题的一个算术解决方案是-
(2*(temp>=0)-1)*np.sqrt(np.abs(temp))
将其移植到numexpr
非常简单-
import numexpr as ne
ne.evaluate('(2*(temp>=0)-1)*sqrt(abs(temp))')
标杆管理
原函数-
def orgfunc(temp):
neg=temp<0
temp=numpy.abs(temp)
temp=numpy.sqrt(temp)
temp[neg]=-temp[neg]
return temp
我很惊讶numexpr没有一个符号函数。@WarrenWeckesser是的!可以很好地添加到他们的列表中。
In [55]: np.random.seed(0)
...: m,n = 1000,1000
...: temp = np.random.randn(m,n)
In [56]: %timeit orgfunc(temp)
100 loops, best of 3: 16 ms per loop
In [57]: %timeit ne.evaluate('(2*(temp>=0)-1)*sqrt(abs(temp))')
100 loops, best of 3: 2.47 ms per loop
In [58]: np.random.seed(0)
...: m,n = 10000,10000
...: temp = np.random.randn(m,n)
In [59]: %timeit orgfunc(temp)
1 loop, best of 3: 2.09 s per loop
In [60]: %timeit ne.evaluate('(2*(temp>=0)-1)*sqrt(abs(temp))')
1 loop, best of 3: 248 ms per loop