2017-09-10 86 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