在 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 样式的视图查看存储在 hdf5 文件中的数组切片?
将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是啥