保存numpy数组的字典

Gab*_*lin 14 python 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
Run Code Online (Sandbox Code Playgroud)

有用.但当我替换时data.items(),data2.items()我得到一个错误:

AttributeError: 'numpy.ndarray' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)

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

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

尝试进入ndarrayvia循环或索引都会导致有关索引0-d数组的错误.像这样dict(data2)的强制转换也无法迭代0-d数组.但是,Spyder显示数组的值,它包含我保存的数据.我只是无法弄清楚如何去做它.

如果我需要重新格式化加载的数据,我会欣赏一些关于如何执行此操作的示例代码.

hpa*_*ulj 22

我们来看一个小例子:

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)
Run Code Online (Sandbox Code Playgroud)

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.]])
Run Code Online (Sandbox Code Playgroud)

  • 我永远不会想到使用`[()]`.我不认为我曾经见过我用过的任何其他语言的索引. (4认同)
  • 索引采用一个元组,数组的每个维度都有一个值。对于 0d 数组,这意味着您可以使用空元组进行索引。它的工作原理就像 `[(1,2)]`、`[1,2]`,只适用于 0d 数组。 (2认同)
  • numpy提供了一种执行完全相同的操作的方法,而不是怪异的[[()]]表示法(我想它对应于使用空元组的索引):`item`。 (2认同)

Ben*_*man 6

我真的很喜欢deepdish(它以HDF5格式保存):

>>> import deepdish as dd
>>> d = {'foo': np.arange(10), 'bar': np.ones((5, 4, 3))}
>>> dd.io.save('test.h5', d)

$ ddls test.h5
/bar                       array (5, 4, 3) [float64]
/foo                       array (10,) [int64]

>>> d = dd.io.load('test.h5')
Run Code Online (Sandbox Code Playgroud)

根据我的经验,它似乎部分打破大型数据集,但:(


SeF*_*SeF 5

使用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'))
Run Code Online (Sandbox Code Playgroud)

因此,您可能缺少.item()重新加载的字典。看一下这个:

for key, key_d in data2.item().items():
    print key, key_d
Run Code Online (Sandbox Code Playgroud)

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


编辑:对于上述item()问题,我认为将字典保存在库中pickle而不是使用字典是更好的选择numpy