有没有办法降低 scipy/numpy 精度以减少内存消耗?

2024-05-26

在我的 64 位 Debian/Lenny 系统(4GByte RAM + 4GByte 交换分区)上,我可以成功执行以下操作:

v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)

但 f 是 anp.complex128内存消耗令人震惊,我无法对结果做更多​​的事情(例如调制系数,然后f=ifftn(f)) 没有MemoryError追溯。

不是安装更多的 RAM 和/或扩展我的交换分区,是否有某种方法可以控制 scipy/numpy“默认精度”并让它计算复杂的 64 数组?

我知道我可以随后减少它f=array(f,dtype=np.complex64);我希望它能够以 32 位精度和一半的内存实际执行 FFT 工作。


scipy 的 fft 函数中似乎没有任何函数可以执行此操作(请参阅http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html ).

除非您能够找到适用于 python 的定点 FFT 库,否则您想要的函数不太可能存在,因为您的本机硬件浮点格式是 128 位。看起来您确实可以使用 rfft 方法来获取 FFT 的实值分量(无相位),这将节省一半的 RAM。

我在交互式 python 中运行了以下命令:

>>> from numpy import *
>>>  v = array(10000*random.random([512,512,512]),dtype=int16)
>>> shape(v)
(512, 512, 512)
>>> type(v[0,0,0])
<type 'numpy.int16'>

此时python的RSS(Resident Set Size)为265MB。

f = fft.fft(v)

而此时python的RSS为2.3GB。

>>> type(f)
<type 'numpy.ndarray'>
>>> type(f[0,0,0]) 
<type 'numpy.complex128'>
>>> v = []

此时 RSS 已降至 2.0GB,因为我已经释放了 v.1.0。

使用“fft.rfft(v)”计算实值只会产生 1.3GB RSS。 (几乎一半,如预期)

Doing:

>>> f = complex64(fft.fft(v))

是两全其美的,因为它首先计算complex128版本(2.3GB),然后将其复制到complex64版本(1.3GB),这意味着我的机器上的峰值RSS是3.6GB,然后它稳定到1.3GB再次。

我认为如果你有 4GB RAM,这一切应该都可以正常工作(就像对我来说一样)。有什么问题吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法降低 scipy/numpy 精度以减少内存消耗? 的相关文章

  • 将人员分配到床位 - 自动化方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我每年都会帮助举办青年营 将与会者分配到卧室是一项艰巨的任务 有 92 个卧室 活动持续一周 与会者停留的时间长短不一 而且床需要重复
  • AssertionError: d['w'] | 的值错误深度学习专业化

    我正在完成深度学习专业的第一门课程 其中第一个编程任务是从头开始构建逻辑回归模型 由于这是我第一次从头开始构建模型 而且我花了一些时间来消化高等数学 所以我有很多错误 其中 我发现了一个我完全无法修复并且无法理解的问题 这是一个断言错误 说
  • Python 有限边界 Voronoi 单元

    我正在尝试改编我在 stackoverflow 上找到的代码来创建具有有限边界的 voronoi 单元 我发现下面的代码https stackoverflow com a 20678647 2443944 https stackoverfl
  • Numpy 附加到一个空数组

    第一种情况 gt gt gt import numpy as np gt gt gt x np array 0 gt gt gt x np append x 1 gt gt gt x array 0 1 x包含 2 个元素 这是为什么 第二
  • python中使用argsort进行排序

    我尝试对数组进行排序 import numpy as np arr 5 3 7 2 6 34 46 344 545 32 5 22 print unsorted print arr np argsort arr print sorted p
  • 内存高效的随机数迭代器,无需替换

    我觉得这应该很容易 但经过多次搜索和尝试后我找不到答案 基本上 我有大量的物品 我想以随机顺序进行采样 而不需要更换 在本例中 它们是二维数组中的单元 我用于较小数组的解决方案不会转换 因为它需要对内存数组进行改组 如果我必须采样的数量很小
  • 使用自定义颜色渐变填充两条线之间的区域

    我正在做一项几乎已经完成的作业 但我想对其添加一些小改动 尝试使用基于温度的颜色图而不是简单的颜色来填充两条线之间的区域 绘制线条的方式本质上使它们成为独立的实体 所以我知道我可能需要两个彼此相遇或重叠的颜色图来完成此任务 但我不太确定如何
  • ValueError:未知标签类型:“连续”

    我看过其他帖子讨论过这个问题 但其中任何一个都可以帮助我 我在 Windows x6 机器上使用带有 Python 3 6 0 的 jupyter 笔记本 我有一个很大的数据集 但我只保留其中的一部分来运行我的模型 这是我使用的一段代码 d
  • 使用 to_categorical 转换 np.array 时出现内存问题

    我有一个像这样的 numpy 数组 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 我这样改造它以减少内存需求 x val x val asty
  • 绘制到图像对象

    我可以保存一个图imshow 因为它返回一个图像对象 如下所示 image plt imshow list interpolation None 后来我想创建其中许多图像的动画 将其保存在列表中并将其渲染为视频 如果这种方法很愚蠢 请告诉我
  • 在 x 轴上操作日期 Pandas Matplotlib

    我有一组非常简单的数据 如下所示 我正在寻找一种方法来绘制此堆积条形图并格式化 x 轴 日期 使其从 1996 年 31 月 12 日开始 到 2016 年 31 月 12 日结束 增量为 365 天 我编写的代码绘制了每个日期 因此 x
  • Python:numpy/pandas 根据条件更改值

    我想知道是否有更快 更 Pythonic 的方法来执行以下操作 例如使用一些内置方法 给定一个 pandas DataFrame 或 numpy 浮点数组 如果该值等于或小于 0 5 我需要计算倒数并乘以 1 并用新计算的值替换旧值 转变
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • ipython/ pylab/ matplotlib安装和初始化错误

    我在 OS X El Captain 上安装了 matplotlib anaconda ipython 然而 即使在尝试以所有可能的方式设置环境变量之后 我仍无法启动 ipython shell pylab 版本 这是错误 ImportEr
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev

随机推荐