Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算负矩阵sqrt的内存有效方法_Python_Performance_Numpy_Sqrt - Fatal编程技术网

Python 计算负矩阵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

我需要计算一个有正数和负数的大矩阵的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), -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