Python 保存numpy数组字典

Python 保存numpy数组字典,python,numpy,Python,Numpy,所以我有一个数据库,里面有几年的站点数据。我现在正试图使用这些数据进行分析——根据关键字对广告成本进行绘图和排序,等等 从数据库抓取的一个数据需要几分钟才能完成。虽然我可以花一些时间优化用于获取数据的SQL语句,但我更愿意简单地将该类和它的SQL放在一边,获取数据,并将结果保存到数据文件中,以便以后更快地检索。大多数数据库数据不会改变,因此我可以编写一个单独的python脚本,每24小时更新一次文件,然后将该文件用于这个长时间运行的任务 数据将作为numpy数组的字典返回。当我使用numpy.s

所以我有一个数据库,里面有几年的站点数据。我现在正试图使用这些数据进行分析——根据关键字对广告成本进行绘图和排序,等等

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

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

具体来说,行
data==data2
返回false。此外,如果我使用以下内容:

for key, key_data in data.items():
  print key
它起作用了。但是当我用
data2.items()
替换
data.items()
时,我得到一个错误:

AttributeError: 'numpy.ndarray' object has no attribute 'items'
使用
键入(数据)
我得到
dict
。使用
type(data2)
我得到
numpy.ndarray

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

尝试通过for循环或索引进入
ndarray
都会导致有关索引0-d数组的错误。像这样的强制转换
dict(data2)
在迭代0-d数组时也会失败。然而,Spyder显示了数组的值,它包含了我保存的数据。我就是不知道怎么去


如果我需要重新格式化加载的数据,我希望能有一些示例代码来说明如何执行此操作。

让我们看一个小示例:

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数组<代码>数据是一本字典。因此它将其包装在一个对象数组中,并使用
pickle
保存该对象。您的
data2
可能具有相同的字符

您可以通过以下方式获得阵列:

In [826]: data2[()]['N']
Out[826]: 
array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.]])
我非常喜欢(它以
HDF5
格式保存它们):


根据我的经验,对于大型数据集来说,这似乎是部分错误的:(

使用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\u dict==my\u dict\u back.item()
仅适用于其值中没有列表或数组的词典



编辑:对于上面提到的
item()
问题,我认为使用库
pickle
保存词典比使用
numpy

保存词典更好,因为我从来没有想过使用
[()]
。我想我从来没有在我使用过的任何其他语言中见过这样的索引。如果你只保存数组字典,而numpy.save使用pickle,那么你最好直接使用pickle?
np。save
是保存数组最直接、最简洁的方法。对于数组字典,我更喜欢
np.savez
。对于dictionary,它可能有数组之外的东西,
np。这里使用的save
,或者
pickle
可能是等效的。有趣的是,我在运行
pickle
时遇到了问题(没有阅读文档)进行比较。索引需要一个元组,数组的每个维度都有一个值。对于0d数组,这意味着您可以使用空元组进行索引。它的工作原理类似于
[(1,2)]
[1,2]
,仅适用于0d数组。而不是奇怪的
[()]
表示法(我猜它对应于使用空元组进行索引),numpy提供了一种做完全相同事情的方法:
item
。对于大型数据集,它以何种方式被破坏?我在保存超大对象列表时遇到了一些问题,而不是保存到将来的self:
np.savez('arrs',**my_dict)
np.save(my_dict)更简单
用于数组的平面dict,因为
np.load('arrs.npz')的结果可以像Python dict一样直接索引。
for key, key_d in data2.item().items():
    print key, key_d