在 ascii 文件中存储 numpy 数组的最佳方法

Posted

技术标签:

【中文标题】在 ascii 文件中存储 numpy 数组的最佳方法【英文标题】:best way to store numpy arrays in ascii files 【发布时间】:2017-09-28 09:24:06 【问题描述】:

我经常处理由于冗长计算而产生的 numpy 数组。我需要在计算的其他地方使用它们。我目前“腌制”它们,并在需要时将文件解压缩到变量中。

我注意到对于大数据量(~1M 数据点),这很慢。我在其他地方读到酸洗不是存储大文件的最佳方式。我想将它们作为 ASCII 文件有效地存储和读取,以直接加载到 numpy 数组中。做这个的最好方式是什么?

假设我在变量“a”中有一个 100k x 3 二维数组。我想将它存储在一个 ASCII 文件中并将其加载到一个 numpy 数组变量“b”中。

【问题讨论】:

【参考方案1】:

Numpy 有一个input and output methods 的范围,可以完全满足您的需求。

一个选项是numpy.save:

import numpy as np

my_array = np.array([1,2,3,4])
with open('data.txt', 'wb') as f:
    np.save(f, my_array, allow_pickle=False)

再次加载您的数据:

with open('data.txt', 'rb') as f:
    my_loaded_array = np.load(f)

【讨论】:

【参考方案2】:

如果你想要效率,ASCII 就不会这样。 pickle 的问题在于它依赖于 python 版本,因此长期存储不是一个好主意。您可以尝试使用其他二进制技术,其中最直接的解决方案是使用numpy.save 方法,如here 所述。

【讨论】:

【参考方案3】:

您提出的问题与数据集的大小直接相关。

对于这个非常常见的问题,专门的库提供了多种解决方案。

    仅 Python 的持久性:joblib 提供了一个 alternative to pickle 专门用于存储太大而无法方便进行酸洗的文件。 HDF5 是一种专门用于存储数组的文件格式。格式是多语言和多平台的,但存在一个非常好的 Python 库:h5py

一个 h5py 的例子。写入数据:

import h5py
with h5py.File('data.h5', 'w') as f:
    f.create_dataset('a', data=a)

读取数据:

import h5py
with h5py.File('data.h5', 'r') as f:
    b = f['a'][:]

【讨论】:

我认为 hdf5 似乎是我的应用程序的正确选项。因为我的问题是存储在 ASCII 文件中(我的意思是人类可读),所以我接受了 np.save 选项作为答案。感谢您的投入。 很公平,感谢您的提及。我希望其他人也会发现它很有用,即使他们正在寻找 ascii 存储:-)

以上是关于在 ascii 文件中存储 numpy 数组的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

在磁盘上保留 numpy 数组的最佳方法

Numpy - 从一维数组中删除最后一个元素的最佳方法?

有没有办法让一个 numpy 样式的视图查看存储在 hdf5 文件中的数组切片?

将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是啥

这是在一行代码中向 numpy 数组添加额外维度的最佳方法吗?

numpy的文件存储,读取 .npy .npz 文件