2013-07-28 21 views
1

我需要將幾個numpy數組和Python對象保存到磁盤。我想完全最小化I/O。我不介意裝入程序或保存程序是否必須在內存中進行任何提升,但I/O佔用空間(實際訪問)應該是最低的,因爲當許多作業訪問文件系統時,羣集中存在問題同時。無法從npz文件加載非數組

我試着用:

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

嘗試

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() 
+0

感謝unutbu,我已經更新了我的OP –

+1

我已經更新了我的答案。 – unutbu