簡體   English   中英

將數據保存到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.

該步驟產生錯誤。 現在,如果我指定一個對象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樣式計算不是特別有用。

另一種選擇是將這些列保留在單獨的數組中,並分別保存它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM