4

モジュールを使用して HDF5 ファイルからデータにアクセスするために Python スライス オブジェクトを使用しようとしていh5pyます。この例をまとめて、numpy配列では機能するが、 では機能しないことを示しh5pyます。

import h5py
import numpy as np

slice_obj = [slice(None,3,None), slice(2,5,None)]

test_array = np.ones((3,5))
print test_array[0:3,2:5]
print test_array[slice_obj]

f = h5py.File("testing.hdf5","w")
f['data'] = test_array
f.close()

f = h5py.File("testing.hdf5","r")
test2 = f['data'][0:3,2:5]
print test2
test2 = f['data'][slice_obj]
print test2
f.close()

これにより、次の出力が得られます。

[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
Traceback (most recent call last):
  File "slice.py", line 17, in <module>
    test2 = f['data'][slice_obj]
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 439, in __getitem__
    self.id.read(mspace, fspace, arr, mtype)
  File "h5d.pyx", line 179, in h5py.h5d.DatasetID.read (h5py/h5d.c:2479)
  File "_proxy.pyx", line 118, in h5py._proxy.dset_rw (h5py/_proxy.c:1300)
  File "_proxy.pyx", line 84, in h5py._proxy.H5PY_H5Dread (h5py/_proxy.c:1051)
IOError: can't read data (Dataset: Read failed)

これが不可能かどうかは誰にもわかりませんh5pyか?そうでない場合、私の例h5pyのようにスライスを明示的に入力する代わりに、オブジェクトまたは変数を使用してスライスする別の方法はありf['data'][0:3,2:5]ますか?

4

1 に答える 1

5

あなたの例で遊んでください:

test2 = f['data']
print test2
print test2.shape
print test2[0:3,2:5]
print test2[slice(None,3,None),slice(2,5,None)]  # ok
print test2[slice_obj[0],slice_obj[1]]  # ok
print test2[tuple(slice_obj)]  # ok
print test2[[slice(None,3,None),slice(2,5,None)]]  # fail
print f['data'][tuple(slice_obj)] 3 ok

したがって、配列はスライスを使用できるように見えh5pyますが、リストを要素に分割することはできません。しかし、タプルが必要です。getitem私の推測では、実装方法にわずかな違いがあると思います。

高度なインデックス作成を行っています。 numpyドキュメント 言います:

高度なインデックス作成は、選択オブジェクト obj... が少なくとも 1 つのシーケンス オブジェクトを含むタプルである場合にトリガーされます。選択オブジェクトがタプルでない場合は、1-これを選択タプルと呼びます。

h5pyタプルへの昇格を行っていない可能性があります。それ以外の場合は、事前のインデックス作成がうまくいくようです。

于 2013-12-11T18:21:21.623 に答える