我正在尝试保存数据数组以及标题信息。目前,我使用numpy.savez()将头信息(字典)保存在一个数组中,将数据保存在另一个数组中。
data = [[1,2,3],[4,5,6]]
header = {'TIME': time, 'POSITION': position}
np.savez(filename, header=header, data=data)
但是,当我尝试加载和读取文件时,我无法索引标题字典。
arrays = np.load(filename)
header = arrays('header')
data = arrays('data')
print header['TIME']
我收到以下错误:
ValueError: field named TIME not found.
在保存之前,标题是'dict'类型。保存/加载后,它是'numpy.ndarray'类型。我可以将它转换回字典吗?或者有更好的方法来实现相同的结果吗?
答案 0 :(得分:14)
np.savez
只保存numpy数组。如果你给它一个字典,它会在保存之前调用np.array(yourdict)
。因此,您会看到type(arrays['header'])
之类的内容为np.ndarray
:
arrays = np.load(filename)
h = arrays['header'] # square brackets!!
>>> h
array({'POSITION': (23, 54), 'TIME': 23.5}, dtype=object)
你会注意到,如果你看它,它是一个0维的单项数组,里面有一个字典:
>>> h.shape
()
>>> h.dtype
dtype('O') # the 'object' dtype, since it's storing a dict, not numbers.
所以你可以这样做:
h = arrays['header'][()]
神秘的索引从0d数组中获取一个值:
>>> h
{'POSITION': (23, 54), 'TIME': 23.5}
答案 1 :(得分:2)
与@ askewchan的评论一样,为什么不np.savez( "tmp.npz", data=data, **d )
?
import numpy as np
data = np.arange( 3 )
time = 23.5
position = [[23, 54], None]
d = dict( TIME=time, POSITION=position )
np.savez( "tmp.npz", data=data, **d )
d = np.load( "tmp.npz" )
for key, val in sorted( d.items() ):
print key, type(val), val # note d.TIME is a 0-d array
<小时/> 这根本不是你的问题,但是下面的小
class Bag
很好,
你可以在IPython中bag.<tab>
:
#...............................................................................
class Bag( dict ):
""" a dict with d.key short for d["key"]
d = Bag( k=v ... / **dict / dict.items() / [(k,v) ...] ) just like dict
"""
# aka Dotdict
def __init__(self, *args, **kwargs):
dict.__init__( self, *args, **kwargs )
self.__dict__ = self
def __getnewargs__(self): # for cPickle.dump( d, file, protocol=-1)
return tuple(self)
d = Bag( np.load( "tmp.npz" ))
if d.TIME > 0:
print "time %g position %s" % (d.TIME, d.POSITION)