保存数据到h5
Saving data to 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)
正如我在评论中所写,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.
该步骤产生了错误。现在,如果我指定一个对象数据类型,我可以将它变成一个数组,一个包含整数和数组的 (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
样式计算不是特别有用。
另一种选择是将列保存在单独的数组中,然后单独保存。
我正在尝试将数据保存到 .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)
正如我在评论中所写,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.
该步骤产生了错误。现在,如果我指定一个对象数据类型,我可以将它变成一个数组,一个包含整数和数组的 (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
样式计算不是特别有用。
另一种选择是将列保存在单独的数组中,然后单独保存。