python - 计算具有负值的大型矩阵的 sqrt 的内存有效方法

标签 python performance numpy sqrt

我需要计算一个包含正数和负数的大矩阵的 sqrt。问题是因为 sqrt 对符号敏感。所以我使用以下代码。

neg=numpy.argwhere(temp<0)
temp=numpy.abs(temp)
temp=numpy.sqrt(temp)
temp[neg]=-temp[neg]

在这段代码中,首先我存储负值的位置,然后在转换为正值后计算平方根,然后向它们附加负号。问题是它在第一个语句中给出了内存错误。

是否有任何替代内存和计算有效的方法来实现相同的任务。矩阵的大小约为O(10^5)

最佳答案

在处理大数据时,我们还可以使用 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

关于python - 计算具有负值的大型矩阵的 sqrt 的内存有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55981069/

相关文章:

python - 检查 Python 字典中列表中的重复元素

python - Weka python 包装器加载器

python - 错误 :gpu_process_transport_factory. cc(1007) - 丢失 UI 共享上下文:在 Headless 模式下通过 ChromeDriver 初始化 Chrome 浏览器时

python - 使用来自 geotiff 的 gdal python 读取高程

python - 一维 NumPy 数组上的滑动标准差

c++ - 高效地创建大量需要访问 "global"对象的小型 C++ 对象

database - Oracle 查询优化器的诊断输出

python - 快速字典查找

python - 如何从 numpy 数组中获取单位向量

python - 安装 SciPy 时出现问题