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

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

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

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

【问题讨论】:

    标签: python arrays numpy bigdata


    【解决方案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】:

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

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

        1. 仅 Python 的持久性:joblib 提供了一个 alternative to pickle 专门用于存储太大而无法方便进行酸洗的文件。
        2. 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 存储:-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-14
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 2021-06-19
        • 2012-03-07
        • 1970-01-01
        相关资源
        最近更新 更多