Python 如何将数组字典保存到Numpy中的文件

Python 如何将数组字典保存到Numpy中的文件,python,numpy,Python,Numpy,我有一个数组的目录 {1:array([...]), 2:array([...]), 3:array([...])} 我想把它保存到一个文件中,稍后再加载回来 我发现numpy有一个方法列表,但它们似乎只处理数组 谢谢。实际上,您可以使用内置库来序列化和反序列化对象,而无需使用numpy 这是一个模拟代码 import pickle data1 = {'a': [1, 2.0, 3, 4 + 6j], 'b': ('string', u'Unicode string'),

我有一个数组的目录

{1:array([...]), 2:array([...]), 3:array([...])}
我想把它保存到一个文件中,稍后再加载回来

我发现numpy有一个方法列表,但它们似乎只处理数组


谢谢。

实际上,您可以使用内置库来序列化和反序列化对象,而无需使用numpy

这是一个模拟代码

import pickle

data1 = {'a': [1, 2.0, 3, 4 + 6j],
         'b': ('string', u'Unicode string'),
         'c': None}

print data1, type(data1)
with open('data.pkl', 'wb') as output:
    # Pickle dictionary using protocol 0.
    pickle.dump(data1, output)

# load data from pkl file
with open("data.pkl", "rb") as fp:
    loaded_data1 = pickle.load(fp)

print loaded_data1, type(loaded_data1)
结果

Before: {'a': [1, 2.0, 3, (4+6j)], 'c': None, 'b': ('string', u'Unicode string')} <type 'dict'>
After: {'a': [1, 2.0, 3, (4+6j)], 'c': None, 'b': ('string', u'Unicode string')} <type 'dict'>
Before:{'a':[1,2.0,3,(4+6j)],'c':无,'b':('string',u'Unicode string'))
之后:{'a':[1,2.0,3,(4+6j)],'c':无,'b':('string',u'Unicode string')}

希望有帮助。

以下脚本将把numpy数组的dict保存到磁盘,然后将其加载回内存

import numpy as np

arr1 = np.arange(0, 10, 1)
arr2 = np.arange(10, 20, 1)
arr3 = np.arange(20, 30, 1)

dct = {'1': arr1, '2': arr2, '3':arr3}

outfile = 'dict_of_arrays.npz'
np.savez(outfile, **dct)

npzfile = np.load(outfile)
print('npzfile.files: {}'.format(npzfile.files))
print('npzfile["1"]: {}'.format(npzfile["1"]))
运行此脚本将显示以下内容:

npzfile.files: ['1', '3', '2']
npzfile["1"]: [0 1 2 3 4 5 6 7 8 9]
请注意,dict键必须是字符串。也许这就是问题所在

我正在运行numpy 1.10.4

使用scipy.io.savemat()/loadmat():

这将在Matlab style.mat文件中保存名称和数组的字典

优点:

1) 您可以将多个数组(包括numpy数组)以二进制格式保存到单个文件中,与保存到json(例如)相比,使用的HD空间要少得多

2) 您不仅可以保存和恢复一维阵列,还可以保存和恢复多维阵列


注意:可能您将不得不使用字符串作为键而不是int。

@GarrettR
savez
savetxt
我是否需要通过
npzfile
循环获取我的
dct
,还是有更简单的方法?但是,将所有键转换为字符串有点不方便。您使用的是什么类型的
key
值?在
npz
中,每个数组都保存在一个文件中,该文件的名称与数组的
name/key
匹配。
npz
本身是这些文件的
zip
存档。
npzfile
的行为类似于dict,您可以对其进行迭代。它确实支持项目分配,所以你不能做像
npzfile[4]=array
这样的事情,但是你可以只做
dct=dict(npzfile)
,然后你就有了一个可以分配新元素的字典;只有在访问
时,才会提取并加载特定数组。噢,感谢您指出这一点。我不知道它是懒惰的,但它是很有意义的,因为我使用元组作为字典的标记,这似乎是编写字典的唯一选择。我想问题是假设我们已经有了numpy ARAY
import scipy.io as sio
sio.savemat(filename, pydict)
...
pydict = sio.loadmat(filename)