首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据保存到h5

将数据保存到h5
EN

Stack Overflow用户
提问于 2017-09-10 08:21:50
回答 1查看 4K关注 0票数 0

我正在尝试将数据保存到.h5文件中。数据格式如下所示:

代码语言:javascript
复制
[(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。

代码片段:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-10 17:22:26

正如我在评论中所写的,h5py保存数组,而不是列表。因此,通过调用,它试图将列表转换为数组:

代码语言:javascript
复制
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)个包含整数和数组的数组。

代码语言:javascript
复制
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不能保存这种数组。

我可以通过以下方法从列表中创建一个结构化数组:

代码语言:javascript
复制
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可以保存以下内容:

代码语言:javascript
复制
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">

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

代码语言:javascript
复制
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)]

虽然更多的时候,我会访问这样的数组是字段名:

代码语言:javascript
复制
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样式的计算并不特别有用。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46138713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档