2017-09-10 71 views
0

我正在尝试将数据保存到.h5文件。数据格式是一些这样的事:将数据保存到h5

[(1, array([[ 1., 1., 1., 1.]]), 64, 64), 
(2, array([[ 1., 1., 1., 1.]]), 64, 64), 
(3, array([[ 1., 1., 1., 1.]]), 64, 64), 
(4, array([[ 1., 1., 1., 1.]]), 64, 64)] 

我收到此错误: ValueError: setting an array element with a sequence.

请帮我将数据保存到H5。

代码片段:

import numpy as np 
dataA = np.ones((1,4)) 
const1 = 64 
const2 = 64 
my_list = [] 

for i in range(1,5): 
    data = (i,dataA,const1,const2) 
    my_list.append(data) 

#print my_list 

#Saving to h5 
import h5py 
f = h5py.File('sample.h5','a') 
f.create_dataset('data',data=my_list,dtype=np.float32) 
+0

从错误它听起来像你试图写入单个数组元素的数据是一个序列..你应该检查你的my_list内容,并尝试手动调试 – Vinny

+3

'h5py'只能存储numpy数组,而不是python列表。它也不能是对象dtype。它可以处理结构化数组。您可能需要将数据保存为多个数组,而不是一个复合数组。 – hpaulj

+0

感谢您的回复。有什么办法可以将我的列表存储到h5中。或者我可以将列表转换为numpy数组 – naik3

回答

1

正如我在评论中写道,h5py节省阵列,而不是名单。因此,随着您的呼叫,它会尝试将您的列表转换为数组:

In [645]: alist 
Out[645]: 
[(1, array([[ 1., 1., 1., 1.]]), 64, 64), 
(2, array([[ 1., 1., 1., 1.]]), 64, 64), 
(3, array([[ 1., 1., 1., 1.]]), 64, 64), 
(4, array([[ 1., 1., 1., 1.]]), 64, 64)] 
In [646]: np.array(alist) 
... 
ValueError: setting an array element with a sequence. 

该步骤会产生错误。现在,如果我指定一个对象dtype,我可以将它变成一个数组,一个包含整数和数组的数组(4,4)。

In [647]: np.array(alist, dtype=object) 
Out[647]: 
array([[1, array([[ 1., 1., 1., 1.]]), 64, 64], 
     [2, array([[ 1., 1., 1., 1.]]), 64, 64], 
     [3, array([[ 1., 1., 1., 1.]]), 64, 64], 
     [4, array([[ 1., 1., 1., 1.]]), 64, 64]], dtype=object) 

但是h5py不能保存那种数组。

我可以做一个结构数组从该列表中有:

In [649]: np.array(alist, dtype='i,4i,i,i') 
Out[649]: 
array([(1, [1, 1, 1, 1], 64, 64), (2, [1, 1, 1, 1], 64, 64), 
     (3, [1, 1, 1, 1], 64, 64), (4, [1, 1, 1, 1], 64, 64)], 
     dtype=[('f0', '<i4'), ('f1', '<i4', (4,)), ('f2', '<i4'), ('f3', '<i4')]) 

出现这种情况的工作,因为它是一个元组列表,一个显著的细节。 h5py可以保存:

In [651]: arr = np.array(alist, dtype='i,4i,i,i') 
In [652]: f.create_dataset('alist', data=arr) 
Out[652]: <HDF5 dataset "alist": shape (4,), type "|V28"> 

,我甚至可以读取,并将其转换回元组的列表:

In [654]: f['alist'][:].tolist() 
Out[654]: 
[(1, array([1, 1, 1, 1]), 64, 64), 
(2, array([1, 1, 1, 1]), 64, 64), 
(3, array([1, 1, 1, 1]), 64, 64), 
(4, array([1, 1, 1, 1]), 64, 64)] 

但更多的时候我访问这样的阵列是字段名称:

In [655]: f['alist']['f1'] 
Out[655]: 
array([[1, 1, 1, 1], 
     [1, 1, 1, 1], 
     [1, 1, 1, 1], 
     [1, 1, 1, 1]]) 

但我想知道你是否足够熟悉numpy以适应结构化数组。为什么要像这样构建列表有什么特别的理由?这对于numpy风格计算并不是特别有用。

另一种选择是将列保存在单独的数组中,并单独保存这些列。

+0

非常感谢。 – naik3