2017-09-10 8 views
0

.h5ファイルにデータを保存しようとしています。データ形式は、このようないくつかのものです: ValueError: setting an array element with a sequence.データを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)] 

コードスニペット:

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

1つの配列要素に書き込もうとしているデータがシーケンスと同じように聞こえるからです。my_listの内容をチェックし、手動でデバッグしてください。 – Vinny

+3

'h5py'は、pythonリスト。また、オブジェクトdtypeにすることもできません。それは構造化配列を扱うことができます。 1つの化合物ではなく複数の配列としてデータを保存する必要があるかもしれません。 – 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')]) 

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"> 

と私も読んで、タプルのリストに戻って、それを変換することができます::h5pyはそれを保存することができますしかし、より頻繁に

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