【问题标题】:Python : save dictionaries through numpy.save [duplicate]Python:通过 numpy.save 保存字典 [重复]
【发布时间】:2017-03-06 07:42:12
【问题描述】:

我在内存中有一个大型数据集(数百万行),采用 numpy 数组字典 的形式。

一旦构建了这些数据,我想将它们存储到文件中; 因此,稍后我可以将这些文件快速加载到内存中,而无需再次从头开始重建这些数据。

np.savenp.load 函数可以顺利完成 numpy 数组的工作。
但我面临 dict 对象的问题。

请参见下面的示例。 d2 是从文件中加载的字典。 请参阅#out[28],它已作为 numpy 数组而不是 dict 加载到 d2 中。因此进一步的 dict 操作(例如 get)不起作用。

有没有办法将文件中的数据加载为 dict(而不是 numpy 数组)?

In [25]: d1={'key1':[5,10], 'key2':[50,100]}

In [26]: np.save("d1.npy", d1)

In [27]: d2=np.load("d1.npy")

In [28]: d2
Out[28]: array({'key2': [50, 100], 'key1': [5, 10]}, dtype=object)

In [30]: d1.get('key1')  #original dict before saving into file
Out[30]: [5, 10]

In [31]: d2.get('key2')  #dictionary loaded from the file
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-31-23e02e45bf22> in <module>()
----> 1 d2.get('key2')

AttributeError: 'numpy.ndarray' object has no attribute 'get'

【问题讨论】:

  • 有什么理由不使用pickle 来作为字典吗?
  • with open('file.pkl', 'wb') as f: pickle.dump(your_dict, f) 应该可以完成这项工作。
  • This post 完美地回答了我的问题。感谢您指出正确的方向。为了立即修复,我正在按照 cmets 中的建议进行d2=load("d1.npy").flat[0]。无论如何,我会尝试移植到泡菜。

标签: python numpy dictionary


【解决方案1】:

这是一个结构化数组。使用d2.item()首先检索实际的dict对象:

import numpy as np

d1={'key1':[5,10], 'key2':[50,100]}
np.save("d1.npy", d1)
d2=np.load("d1.npy")
print d1.get('key1')
print d2.item().get('key2')

结果:

[5, 10]
[50, 100]

【讨论】:

  • d2.item() 完美运行。谢谢。
  • 也 d2.flat[0] 有效,如this post中所述
  • @ramu 是的,请注意,您可以通过单击答案的复选标记来接受您认为对您的问题有用的答案。在这种情况下,可能正在寻找相同问题的其他人会很快找到适合您的答案。
  • 甚至,d2.any().get('key1')d2.all().get('key1') 有效
  • @SanjayPoongunran,感谢我这种 numpy 的奇怪行为,只有你的解决方案有效:)
【解决方案2】:

pickle 模块可以使用。示例代码:

from six.moves import cPickle as pickle #for performance
from __future__ import print_function
import numpy as np

def save_dict(di_, filename_):
    with open(filename_, 'wb') as f:
        pickle.dump(di_, f)

def load_dict(filename_):
    with open(filename_, 'rb') as f:
        ret_di = pickle.load(f)
    return ret_di

if __name__ == '__main__':
    g_data = {
        'm':np.random.rand(4,4),
        'n':np.random.rand(2,2,2)
    }
    save_dict(g_data, './data.pkl')
    g_data2 = load_dict('./data.pkl')
    print(g_data['m'] == g_data2['m'])
    print(g_data['n'] == g_data2['n'])

您还可以将多个 python 对象保存在一个腌制文件中。在这种情况下,每个pickle.load 调用都会加载一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2017-03-12
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2015-08-26
    • 2020-02-19
    相关资源
    最近更新 更多