计算具有负值的大矩阵的 sqrt 的内存有效方法
Memory efficient method to compute sqrt of large matrix with negative values
我需要计算具有正数和负数的大型矩阵的平方根。问题是因为 sqrt 对符号敏感。所以我使用下面的代码。
neg=numpy.argwhere(temp<0)
temp=numpy.abs(temp)
temp=numpy.sqrt(temp)
temp[neg]=-temp[neg]
在此代码中,首先我存储负值的位置,然后在转换为正值后计算平方根,然后在其上附加负号。问题是它在第一条语句中给出了内存错误。
是否有任何替代内存和计算效率高的方法来完成相同的任务。矩阵的大小是O(10^5)
的数量级
Numpy "where" 是解决您的问题的合适替代方法,请尝试以下代码:
result = numpy.where(a>=0, numpy.sqrt(a), -numpy.sqrt(-a))
这行代码 returns 矩阵中数字的 sqrt 如果它是正数或零,否则 returns 负数或负数 sqrt。
在处理大数据时,如果预期的操作可以表示为算术运算,我们还可以使用支持多核处理的numexpr
module。需要注意的是我们需要使用算术向量化运算。所以,我们问题的算术解是 -
(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
大型阵列的计时 -
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
我需要计算具有正数和负数的大型矩阵的平方根。问题是因为 sqrt 对符号敏感。所以我使用下面的代码。
neg=numpy.argwhere(temp<0)
temp=numpy.abs(temp)
temp=numpy.sqrt(temp)
temp[neg]=-temp[neg]
在此代码中,首先我存储负值的位置,然后在转换为正值后计算平方根,然后在其上附加负号。问题是它在第一条语句中给出了内存错误。
是否有任何替代内存和计算效率高的方法来完成相同的任务。矩阵的大小是O(10^5)
Numpy "where" 是解决您的问题的合适替代方法,请尝试以下代码:
result = numpy.where(a>=0, numpy.sqrt(a), -numpy.sqrt(-a))
这行代码 returns 矩阵中数字的 sqrt 如果它是正数或零,否则 returns 负数或负数 sqrt。
在处理大数据时,如果预期的操作可以表示为算术运算,我们还可以使用支持多核处理的numexpr
module。需要注意的是我们需要使用算术向量化运算。所以,我们问题的算术解是 -
(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
大型阵列的计时 -
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