减少 numpy 数组的内存大小

2023-12-24

我正在为深度学习创建窗口数据的数据集。我将数据生成为 numpy 数组,其中 4 个形状为 (141038, 360) 的数组和 1 个形状为 (141038, ) 的标签的数组。我将数组保存在 npz 文件中,但文件大小太大,达到 1.5 GB。我是 python 和编程新手,所以不知道文件大小应该有多大。不过,我将数组转换为 Pandas 数据帧,内存使用量在相同范围内。问题是我有 6 个 9 GB 的文件,可能还有另一个重叠的数据集,该数据集大 7 倍,因此可能有 63 GB。

  • 这样的文件大小是否现实或者我做错了什么? (这只是一个带有一些数字的文件而不是游戏)

  • 是否有另一种格式可以以更少的内存使用来保存我的数组? (我尝试了 HFD5 但我得到了相同的文件大小)

  • 我尝试更改数据类型,它稍微减小了大小。 (3 个数组 (f8), 1 (int8), 1 (uint8)) 是否还有其他数据类型可以进一步减小大小?对于 0/1 值,是否有另一种数据类型比 (uint) 更有效?

  • 对于浮点数组,如果我降低精度,会有帮助吗?或者还有另一种方法可以减小它们的大小?

  • 我有一些文件填充了零填充,一些文件填充了边缘填充,其他文件填充了插值。然而,所有文件几乎具有相同的大小,带有零填充的文件不应该具有较小的大小吗?


  1. 是的,如果您使用浮点类型数据,那肯定是这样。

  2. 你可以试试numpy.savez_compressed保存为压缩数组。

ref: https://docs.scipy.org/doc/numpy/reference/ generated/numpy.savez_compressed.html https://docs.scipy.org/doc/numpy/reference/generated/numpy.savez_compressed.html

您可以使用gzip也很重要,但压缩算法很重要。

import gzip
import numpy

f = gzip.GzipFile("x.npy.gz", "w")
numpy.save(file=f, arr=x)
f.close()

这可能有用:高效压缩 numpy 数组 https://stackoverflow.com/questions/22400652/compress-numpy-arrays-efficiently

  1. 对于二进制数据,uint8似乎有很多浪费。事实上,您可以在一个值中存储 8 个值 (0/1)uin8。只需将 0、1 视为位,即可在单个位中编码 8 位uint8通过简单的二元运算。

您可以使用“boolean”来存储 0/1 值。

import numpy as np
import sys

b = np.array([0, 1, 0]*50000, dtype='b')

print(sys.getsizeof(b))

u8 = np.array([0, 1, 0]*50000, dtype='u8')

print(sys.getsizeof(u8))
150096
1200096
  1. 当然是。如果您认为有损压缩是一种选择,则可以使用良好的因子来压缩阵列。

  2. 没关系,唯一重要的是形状和数据类型。 Numpy 数组未压缩。如果将其与图像进行比较 - 那是错误的,类似“黑色图像由于均匀性而尺寸较小,因此零填充数组应该消耗更少的空间” - 是无关紧要的(图像通常是有损压缩的 JPEG)。

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

减少 numpy 数组的内存大小 的相关文章

  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 从 Laravel 4 输入生成新数组

    我使用 Input all 从动态生成的表单中获取一些输入 我使用 jQuery 来允许用户添加字段 字段名称为 first names last names 和 emails input 变量现在看起来像这样 array size 4 t
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 如何使用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
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐