减少 numpy 数组的内存大小

His*_*i51 5 python arrays numpy

我正在为深度学习创建窗口数据的数据集。我将数据生成为 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) 更有效?

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

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

Zab*_*azi 3

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

  2. 您可以尝试numpy.savez_compressed另存为压缩数组。

参考: 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()
Run Code Online (Sandbox Code Playgroud)

这可能有用:有效压缩 numpy 数组

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

您可以使用“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))
Run Code Online (Sandbox Code Playgroud)
150096
1200096
Run Code Online (Sandbox Code Playgroud)
  1. 当然是。如果您认为有损压缩是一种选择,则可以使用良好的因子来压缩阵列。

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