【问题标题】:Saving many arrays of different lengths保存许多不同长度的数组
【发布时间】:2014-05-03 18:14:02
【问题描述】:

我有大约 8000 个二维点数组,作​​为 numpy 数组的 Python 列表存储在内存中。每个数组的形状为(x,2),其中x 是一个介于~600 和~4000 之间的数字。本质上,我有一个锯齿状的 3-d 数组。

我想以方便/快速的格式存储这些数据,以便从磁盘读取/写入。我宁愿不创建 ~8000 个单独的文件,但如果可以避免的话,我也宁愿不要用零填充完整的 (8000,4000,2) 矩阵。

我应该如何将我的数据存储在磁盘上,以使文件大小和解析/序列化都最小化?

【问题讨论】:

  • 你可以使用numpy.savez()
  • 也许vstack数组,同时记住偏移量,并将其存储为np.memmap

标签: python numpy


【解决方案1】:

有一个称为 HDF 的标准用于存储大量数据集。您可以在以下链接中找到一些信息,但总的来说,HDF 定义了一种可用于存储大量信息的二进制文件格式。

您可以找到在磁盘上存储大型 Numpy 数组的示例 here。在那篇文章中,作者对 Python Pickle 和 HDF5 进行了比较。

我还向您推荐this HDF5 简介。 Here's th h5py 包,它是 HDF5 二进制数据格式的 Pythonic 接口。

【讨论】:

    【解决方案2】:

    将所有 numpy 数组放入单个 python 列表中,然后将 picklecPickle 放入该列表中。

    例如:

    import cPickle
    from numpy import array, ones
    a = array((5,2))
    b = ones((10,2))
    c = array((20,2))
    all = [a,b,c]
    cPickle.dump(all, open('all_my_arrays', 'w'))
    

    然后您可以使用以下命令检索它们:

    all2 = cPickle.load(open('all_my_arrays'))
    

    请注意,列表all 不需要任何大量的新内存分配。因为all 只是一个指向您的 numpy 数组的指针列表,所以不需要用零填充或以其他方式复制。

    相对于 pickle,HDF5 的优势在于大型阵列上的速度和跨应用程序支持(octave、perl 等)。另一方面,pickle 的优点是不需要任何额外的软件安装(它包含在 python 中)并且它还可以原生地理解 python 对象。

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2016-03-11
      • 2013-08-21
      • 2020-01-17
      • 2020-06-22
      • 2014-02-28
      • 2020-10-29
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多