【问题标题】:Python - efficient way to save an array with multiple labelsPython - 保存具有多个标签的数组的有效方法
【发布时间】:2021-09-27 17:12:18
【问题描述】:

我目前正在从一个进程中保存一些数据。

np.save('stochastic_data',(rho_av,rho_std))

其中 rho_av 和 rho_std 是数组。

但是,这些数据取决于一些参数,例如 E、k 和 M。对于它们中的每一个,我得到不同的数据。但我只保存一组给定参数的数据,即我修复(E,k,M),我得到数据并保存它。但是,从我拥有的数据中无法检索参数集(E,k,M)。 因此,我想用我的数组保存这个集合。

我的第一个方法是简单地做

np.save('stochastic_data',(rho_av,rho_std, E, k, M))

但这不起作用,因为我的参数是浮点数,而不是数组。

我的第二种方法是将参数集转换为数组。基本上,为每个参数创建一个相同元素的数组,即 E-> np.array(E,E,.....,E)。但是,我的数组很大(np.shape(rho_av)=(100000,1000)),所以用这个形状保存参数效率不高。

有没有更有效的方法?

谢谢。

【问题讨论】:

    标签: python arrays numpy dictionary save


    【解决方案1】:

    您正在保存一组数组。

    看看两个具有相同形状的数组的简单情况会发生什么:

    In [763]: np.save('test.npy',(np.arange(3), np.ones(3)))
    In [764]: np.load('test.npy')
    Out[764]: 
    array([[0., 1., 2.],
           [1., 1., 1.]])
    

    我取回了一个数组 - 它从元组中创建了一个数组并保存了它。

    如果数组的形状不同,我仍然会得到一个数组,但它是 object dtype。我收到警告(在足够新的 numpy 版本中):

    In [765]: np.save('test.npy',(np.arange(3), np.ones(4)))
    /usr/local/lib/python3.8/dist-packages/numpy/lib/npyio.py:528: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
      arr = np.asanyarray(arr)
    In [766]: np.load('test.npy')
    Traceback (most recent call last):
      File "<ipython-input-766-aeaca1f70e0f>", line 1, in <module>
        np.load('test.npy')
      File "/usr/local/lib/python3.8/dist-packages/numpy/lib/npyio.py", line 440, in load
        return format.read_array(fid, allow_pickle=allow_pickle,
      File "/usr/local/lib/python3.8/dist-packages/numpy/lib/format.py", line 743, in read_array
        raise ValueError("Object arrays cannot be loaded when "
    ValueError: Object arrays cannot be loaded when allow_pickle=False
    
    In [767]: np.load('test.npy',allow_pickle=True)
    Out[767]: array([array([0, 1, 2]), array([1., 1., 1., 1.])], dtype=object)
    

    np.save 对于编写数字多维数组非常有效。但是该数组有objects,它使用pickle 将其转换为可以保存的字符串。这还不错,因为对数组执行pickle 实际上使用与np.save 相同的核心代码。

    有一个 np.savez 将数组保存到单独的 npy 文件中,并将它们合并到一个 zip 存档中。

    但是对于多种项目组合 - 数组、列表、标量、字符串等,pickle 可能是最简单和“最有效”的。但是您不能零碎地保存或加载项目。它不是数据库。

    【讨论】:

    • 感谢泡菜的想法。我非常适合我的情况!
    猜你喜欢
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多