2015-10-20 45 views
0

我已經能夠使用h5py在我的HDF5文件中創建一個由無符號int和可變長度字符串組成的複合數據集,但是我無法寫入到它。通過h5py(HDF5)寫入具有可變長度字符串的化合物數據集

dt = h5py.special_dtype(vlen=str) 
dset = fout.create_dataset(ver, (1,), dtype=np.dtype([("time", np.uint64),("value", dt)])) 

我已經寫入到其它化合物的數據集相當容易地通過如等於設定化合物數據集的特定列(多個)到現有的陣列numpy的。

現在,我遇到麻煩的是寫入具有可變長度字符串的複合數據集。 Numpy不支持可變長度的字符串,所以我不能創建包含該值的numpy數組。

我的下一個想法是將單個值寫入所討論的列,並且這對無符號整數有效。當我嘗試寫,雖然一個字符串的複合數據集中的可變lenght串場,我得到:

dset["value"] = str("blah") 
    File "D:\Anaconda3\lib\site-packages\h5py\_hl\dataset.py", line 508, in __setitem__ 
    val = val.astype(numpy.dtype([(names[0], dtype)])) 
ValueError: Setting void-array with object members using buffer. 

任何指導,將不勝感激。

回答

2

繼我以前的答案Inexplicable behavior when using vlen with h5py

我跑這個測試(h5py版本 '2.2.1'):

In [4]: import h5py 
In [5]: dt = h5py.special_dtype(vlen=str) 
In [6]: f=h5py.File('foo.hdf5') 
In [8]: ds1 = f.create_dataset('JustStrings',(10,), dtype=dt) 
In [10]: ds1[0]='string' 
In [11]: ds1[1]='a longer string' 
In [13]: ds1[2:5]='one_string two_strings three'.split() 

In [14]: ds1 
Out[14]: <HDF5 dataset "JustStrings": shape (10,), type "|O4"> 

In [15]: ds1.value 
Out[15]: 
array(['string', 'a longer string', 'one_string', 'two_strings', 'three', 
     '', '', '', '', ''], dtype=object) 

而對於混合D型像你這樣的:

In [16]: ds2 = f.create_dataset('IntandStrings',(10,), 
    dtype=np.dtype([("number",int),('astring',dt)])) 
In [17]: ds2[0]=(1,'astring') 
In [18]: ds2[1]=(10,'a longer string') 
In [19]: ds2[2:4]=[(10,'a longer much string'),(0,'')] 
In [20]: ds2.value 
Out[20]: 
array([(1, 'astring'), (10, 'a longer string'), 
     (10, 'a longer much string'), (0, ''), (0, ''), (0, ''), (0, ''), 
     (0, ''), (0, ''), (0, '')], 
     dtype=[('number', '<i4'), ('astring', 'O')]) 

試圖設置一個字段本身似乎並不工作

ds2['astring'][4]='one two three four' 

相反,我必須設置全程記錄:

ds2[4]=(123,'one two three four') 

嘗試設置整場產生了同樣的錯誤:

ds2['astring']='astring' 

我草簽該數據集(10,),而你是(1,)。但我認爲這是同樣的問題。

我可以,不過,集全數字字段:

In [48]: ds2['number']=np.arange(10) 
In [50]: ds2['number'] 
Out[50]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
In [51]: ds2.value 
Out[51]: 
array([(0, 'astring'), (1, 'a longer string'), 
     (2, 'a longer much string'), 
     (3, ''), (4, 'one two three four'), (5, ''), 
     (6, ''), (7, ''), 
     (8, ''), (9, '')], 
     dtype=[('number', '<i4'), ('astring', 'O')]) 
+0

感謝jpaulj!我非常親密,但卻在圈子裏。謝謝你非常全面的答案。 – EnemyBagJones