无法从npz文件加载非数组

时间:2013-07-28 21:03:11

标签: python numpy io

我需要将几个numpy数组和Python对象保存到磁盘。我想完全最小化I / O.我不介意装载程序或保护程序是否必须在内存中进行任何提升,但 I / O占用(实际访问)应该是最低的,因为我们在群集中遇到许多工作时出现问题同时访问文件系统。

我尝试过:

import numpy as np

my_data = dict()

my_data['r1'] = np.random.randint(3, size=(100,200))
my_data['rs'] = np.random.randint(3, size=(50,400))

my_data['annotation_info'] = 'Two random arrays'
my_data['current_date']    = 'July 28' 

np.savez('test.npz', my_data = my_data)

但是当我加载它时,我得到:

temp = np.load('test.npz')
my_data = temp['my_data']
my_data['r1']

ValueError: field named features not found

此外,my_data现在似乎是一个数组,my_data.shape返回()。奇怪的是,如果我这样做:

print(my_data)

我明白了:

{'current_date': 'July 28', 'rs': array([[0, 1, 0, ..., 0, 2, 0],
       [1, 1, 1, ..., 1, 1, 0],
       [2, 1, 1, ..., 1, 1, 0],
       ..., 
       [1, 0, 2, ..., 2, 0, 1],
       [0, 2, 0, ..., 1, 1, 0],
       [1, 1, 0, ..., 1, 1, 1]]), 'annotation_info': 'Two random arrays', '
r1': array([[2, 0, 1, ..., 0, 2, 2],                                      
       [0, 0, 2, ..., 0, 2, 1],
       [2, 2, 2, ..., 1, 0, 0],
       ..., 
       [0, 2, 1, ..., 2, 0, 0],
       [0, 0, 1, ..., 2, 1, 0],
       [2, 1, 2, ..., 0, 2, 2]])}

更新

如果我按照unutbu推荐的那样做:

np.savez('test.npz', **my_data)
my_data = np.load('test.npz')
my_variable = my_data['annotation_info']

my_variable不是字符串,例如my_variable.upper()返回:

numpy.ndarray object has no attribute 'upper' 

实际上type(my_variable)会返回:

numpy.ndarray

但同样,my_variable[0]会引发错误,my_variable.shape会返回()(这似乎是0-Rank array

如何访问存储在数组中的实际对象?

1 个答案:

答案 0 :(得分:1)

尝试

np.savez('test.npz', **my_data)
my_data = np.load('test.npz')
print(my_data['r1'])

NumPy将字符串保存为NumPy数组。要以Python对象的形式访问字符串,可以使用item方法:

my_data = np.load('test.npz')
my_variable = my_data['annotation_info'].item()