(原+译)使用numpy.savez保存字典后读取的问题

本文介绍如何使用numpy.savez保存包含字典在内的多个变量,并提供了从保存的文件中正确加载并还原字典的方法。

转载请注明出处:

http://www.cnblogs.com/darkknightzh/p/7608928.html

参考网址;

https://stackoverflow.com/questions/22315595/saving-dictionary-of-header-information-using-numpy-savez

python中,使用pickle保存变量时,如果变量过大,会无法保存文件。此时可以使用numpy.savez来保存变量(numpy.save保存一个变量,numpy.savez可以一次保存多个变量)。

但是numpy.savez只会保存numpy arrays。如果保存字典,载入后,变量类型为type(arrays['header'])

arrays = np.load(filename)
h = arrays['key'] # h为array({'POSITION': (23, 54), 'TIME': 23.5}, dtype=object)

h.shape为()

h.dtype为dtype('O') # the 'object' dtype, since it's storing a dict, not numbers.

可以通过下面的方法来获取该字典(见参考网址):

h = arrays['key'][()]

h为{'POSITION': (23, 54), 'TIME': 23.5},即为保存的字典

<think>好的,我现在需要解决用户的问题:如何使用numpysavez函数保存Python字典变量,并且提供示例代码。首先,我得回忆一下numpysavez的用法和相关文档。 根据用户提供的引用资料,引用[4]提到np.savez()可以保存多个数组到同一个文件,例如保存a和b为k_a和k_b。但用户的问题是关于保存字典变量,而不仅仅是数组。可能需要将字典转换为数组,或者找到其他方法。 首先,numpy.savez默认保存的是数组,但Python字典本身不是数组结构。不过,用户可能想将字典中的值保存为多个数组,每个键对应一个数组。例如,如果字典的值都是numpy数组,那么可以直接使用**解包运算符将字典的键值对作为关键字参数传递给savez。例如,np.savez('file.npz', **my_dict),这样每个键会成为保存的数组名,对应的值就是数组。这种方法是否可行? 但需要验证这一点是否正确。例如,假设有一个字典data = {'a': arr1, 'b': arr2},使用np.savez('data.npz', **data)后,加载时应该可以通过np.load('data.npz')['a']来获取arr1。这应该可行,因为savez接受关键字参数,每个参数名作为数组名,值作为数组。所以对于字典中的每个键值对,使用**解包是正确的。 另外,用户可能的问题是将整个字典作为一个对象保存,而不仅仅是里面的数组。这时候可能需要用其他方法,比如使用pickle,但用户明确要求使用numpysavez函数。因此,正确的做法是将字典中的每个值转换为numpy数组,然后保存,每个键对应一个数组。但如果字典的值包含非数组数据,可能需要先转换。 接下来,我需要编写示例代码。假设用户有一个字典,其中包含几个numpy数组作为值。例如: import numpy as np data_dict = { 'array1': np.array([1, 2, 3]), 'array2': np.arange(10).reshape(2,5) } np.savez('dict_data.npz', **data_dict) 然后加载的时候: loaded = np.load('dict_data.npz') print(loaded['array1']) print(loaded['array2']) 这样应该可以正确保存和加载。但需要注意,如果字典中有非数组的值,比如列表或其他类型,可能需要先转换为数组,否则numpy可能会报错。例如,如果字典中的某个值是列表,np.savez会尝试将其转换为数组,但如果无法转换,就会出错。所以在保存前需要确保所有值都是numpy数组。 另外,用户可能想保存整个字典对象为一个数组,但这可能不太合适,因为savez主要用于保存多个数组。如果需要保存整个字典,包含键和值,可能需要使用np.savez_compressed或者其他方法,或者结合pickle。但根据用户的问题,他们希望使用savez,所以正确的做法是将字典中的每个值保存为单独的数组,键作为数组名。 总结步骤: 1. 确保字典中的每个值都是numpy数组。 2. 使用np.savez('filename.npz', **dict)保存。 3. 加载时使用np.load,并通过键来访问数组。 需要确认是否正确。根据numpy的文档,savez函数确实允许通过关键字参数来保存数组,所以解包字典是正确的做法。因此,示例代码应该有效。</think>要使用NumPy的`np.savez`函数保存Python字典变量,需要确保字典的值均为NumPy数组。通过字典解包的方式将键值对作为命名数组保存,具体实现如下: ### 分步说明 1. **准备字典数据**:字典的键将作为保存后的数组名称,值必须为NumPy数组。 2. **使用`np.savez`保存**:通过`**`运算符解包字典,将键值对转换为命名数组参数。 3. **加载验证数据**:使用`np.load`读取文件,并通过键名访问对应的数组。 ### 示例代码 ```python import numpy as np # 创建包含NumPy数组的字典 data_dict = { 'temperature': np.array([25.3, 26.1, 24.8]), 'pressure': np.linspace(1013, 1020, 5), 'matrix': np.eye(3) } # 保存字典.npz文件 np.savez('sensor_data.npz', **data_dict) # 加载数据验证 loaded = np.load('sensor_data.npz') print("温度数据:", loaded['temperature']) print("压强序列:", loaded['pressure']) print("单位矩阵:\n", loaded['matrix']) ``` ### 注意事项 - **数据类型限制**:字典值必须是可转换为NumPy数组的数据类型,否则会抛出`TypeError`。 - **文件扩展名**:建议使用`.npz`扩展名以明确文件格式[^4]。 - **复合数据类型**:若需保存非数组数据(如字符串),需先通过`np.array`进行封装: ```python data_dict['info'] = np.array(['2023-08-01', 'Lab3']) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值