【问题标题】:Save list of numpy arrays onto disk将 numpy 数组列表保存到磁盘上
【发布时间】:2018-10-26 17:11:34
【问题描述】:

我有一个42000 numpy 数组列表(每个数组都是240x240),我想将其保存到一个文件中以用于另一个python 脚本。

我尝试使用 picklenumpy.savez_compressed 并遇到内存错误(我有 16gb DDR3)。我读到hdf5 通常用于深度学习的东西不能保存列表,所以我有点卡住了。

有人知道如何保存我的数据吗?

编辑:我之前使用np.save 将这些数据保存到磁盘上的 numpy 数组中,它大约为 2.3GB,但我的计算机无法始终处理它,因此如果我尝试处理它有时会崩溃。我阅读列表可能会更好,所以我已经转向使用 numpy 数组列表

【问题讨论】:

  • 从列表中创建一个一维 numpy 数组
  • 我遇到了另一个内存错误。当我之前尝试使用 numpy 数组并以 .npy 格式保存到磁盘时,它大约为 2.3GB。
  • 您是否尝试过使用 scipy.io.savemat 保存在 .mat 文件中?您可以将所有 42000 个矩阵分别保存在一个目录中,然后您可以在新脚本中读取该目录。 docs.scipy.org/doc/scipy-0.19.0/reference/generated/… 您也可以使用 scipy.io.savemat 进行压缩
  • 您可以使用 numpy.memmap 避免在数组太大时将数据分配到 RAM 中。
  • 尝试保存块。例如,每个文件都是 100 个 numpy 数组的一维数组

标签: python list numpy hdf5 h5py


【解决方案1】:

假设我们有一个numpy 数组列表A,并希望将这些按顺序保存到 HDF5 文件中。

我们可以使用h5py库创建数据集,每个数据集对应A中的一个数组。

import h5py, numpy as np

A = [arr1, arr2, arr3]  # each arrX is a numpy array

with h5py.File('file.h5', 'w', libver='latest') as f:  # use 'latest' for performance

    for idx, arr in enumerate(A):
        dset = f.create_dataset(str(idx), shape=(240, 240), data=arr, chunks=(240, 240)
                                compression='gzip', compression_opts=9)

出于兼容性原因,我在这里使用gzip 压缩,因为它随每个 HDF5 安装一起提供。您可能还希望考虑blosclzf 过滤器。我还将chunks 设置为等于shape,假设您打算读取整个数组而不是部分数组。

h5py documentation 是提高您对 HDF5 格式理解的绝佳资源,因为h5py API 紧跟 C API。

【讨论】:

  • 谢谢你,太好了!我确实为您准备了一些后续 qs(如果您愿意,我可以将它们作为单独的 qs 发布): 1. 是否将每个阵列直接存储到磁盘上? 2. 是否可以在这个 h5 文件中追加更多的数组? 3. 我如何从中读取?我假设每个数组都标有一个数字?
  • @nababs,是的,关于您不了解的有关 HDF5 的问题,作为一个单独的问题可能值得提出。您的问题的简短答案是 1) 是的,2) 是的。
  • 应该提到,将块形状设置为与数据集形状相同通常是一个坏主意。在这种情况下,它可以工作,但如果块大于 4GB,它将失败。太大的块通常也会对压缩性能产生负面影响。此外,通常不推荐创建大量非常小的数据集(无论是速度还是压缩效率)
  • @max9111,优秀的分数。我不确定用例是什么。例如,不时提取一个数据集,或多次提取一系列数据集。我们需要 OP 提供有关如何使用数据提供进一步指导的更多信息。正如我们所知,numpy 数组列表已经非常低效:)。
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2014-05-02
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多