保存 numpy 数组的字典

新手上路,请多包涵

所以我有一个数据库,其中包含几年的站点数据。我现在正尝试使用该数据进行分析——按关键字绘制和排序广告费用等。

从数据库中获取的数据之一需要几分钟才能完成。虽然我可以花一些时间优化我用来获取数据的 SQL 语句,但我更愿意简单地离开那个类,它只是 SQL,抓取数据,并将结果保存到数据文件中,以便以后更快地检索。大多数数据库数据都不会改变,所以我可以编写一个单独的 python 脚本来每 24 小时更新一次文件,然后将该文件用于这个长时间运行的任务。

数据作为 numpy 数组的字典返回。当我使用 numpy.save('data', data) 文件保存得很好。当我使用 data2 = numpy.load('data.npy') 它加载文件时没有错误。但是,输出 data2 不等于原来的 data

特别是行 data == data2 返回 false。此外,如果我使用以下内容:

 for key, key_data in data.items():
  print key

有用。但是,当我将 data.items() 替换为 data2.items() 时,出现错误:

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

使用 type(data) 我得到 dict 。使用 type(data2) 我得到 numpy.ndarray

那么我该如何解决呢?我希望加载的数据等于我传入的用于保存的数据。是否有 numpy.save 的参数来解决这个问题,或者我是否需要某种形式的简单重新格式化函数来将加载的数据重新格式化为正确的结构?

尝试通过 for 循环或索引进入 ndarray 都会导致有关索引 0-d 数组的错误。像这样投射 dict(data2) 也无法迭代 0-d 数组。然而,Spyder 显示数组的值,它包括我保存的数据。我只是不知道如何去做。

如果我需要重新格式化加载的数据,我会很感激一些关于如何做到这一点的示例代码。

原文由 Gabe Spradlin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

让我们看一个小例子:

 In [819]: N
Out[819]:
array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.]])

In [820]: data={'N':N}

In [821]: np.save('temp.npy',data)

In [822]: data2=np.load('temp.npy')

In [823]: data2
Out[823]:
array({'N': array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.]])}, dtype=object)

np.save 用于保存numpy数组。 data 是一本字典。所以它将它包装在一个对象数组中,并使用 pickle 来保存该对象。您的 data2 可能具有相同的字符。

您可以通过以下方式获得数组:

 In [826]: data2[()]['N']
Out[826]:
array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.]])

原文由 hpaulj 发布,翻译遵循 CC BY-SA 3.0 许可协议

当用 numpy 保存字典时,字典被编码成一个数组。要获得您需要的东西,您可以按照本例中的操作进行操作:

 my_dict = {'a' : np.array(range(3)), 'b': np.array(range(4))}

np.save('my_dict.npy',  my_dict)

my_dict_back = np.load('my_dict.npy')

print(my_dict_back.item().keys())
print(my_dict_back.item().get('a'))

所以你可能缺少 .item() 重新加载的字典。看一下这个:

 for key, key_d in data2.item().items():
    print key, key_d

比较 my_dict == my_dict_back.item() 仅适用于其值中没有列表或数组的字典。


编辑:对于上面提到的 item() 问题,我认为用库保存字典是一个更好的选择 pickle 而不是 numpy


第二次编辑:如果对 pickle 不满意,并且字典中的所有类型都与 兼容, json 也是一个选项。

原文由 SeF 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏