2

3 つの double と 1 つの bolen を使用して配列を作成し、次を使用numpyしてファイルに書き込みましたh5py

import numpy as np
import h5py

data = np.zeros(10, dtype=[("THETA",np.double),("PHI",np.double),("PSI",np. double),("FLAG",np.bool)])

with h5py.File("testout.h5") as f:
    f.create_dataset("data", data=data)

h5pyブール フィールドの列挙型を作成します。

HDF5 "testout.h5" {
GROUP "/" {
   DATASET "data" {
      DATATYPE  H5T_COMPOUND {
         H5T_IEEE_F64LE "THETA";
         H5T_IEEE_F64LE "PHI";
         H5T_IEEE_F64LE "PSI";
         H5T_ENUM {
            H5T_STD_I8LE;
            "FALSE"            0;
            "TRUE"             1;
         } "FLAG";
      }
      DATASPACE  SIMPLE { ( 10 ) / ( 10 ) }
   }
}
}

ここで、C を使用してこのファイルを読み取る必要があり、複雑になります。

typedef enum {
    false = 0;
    true
} bool;

typedef struct {
    double THETA, PHI, PSI;
    bool FLAG;
} pointing_t;

列挙型を持つ型を定義する方法がわかりません:

hid_t memtype = H5Tcreate (H5T_COMPOUND, sizeof(pointing_t));
H5Tinsert (memtype, "THETA", HOFFSET (pointing_t, THETA),  H5T_NATIVE_DOUBLE);
H5Tinsert (memtype, "PHI", HOFFSET (pointing_t, PHI),  H5T_NATIVE_DOUBLE);
H5Tinsert (memtype, "PSI", HOFFSET (pointing_t, PSI),  H5T_NATIVE_DOUBLE);
# this should be an ENUM!!
H5Tinsert (memtype, "FLAG", HOFFSET (pointing_t, FLAG),  H5T_NATIVE_DOUBLE);

前のpythonスニペットで作成されたhdf5ファイルを読み取ろうとする完全な「機能しない」例をgistに貼り付けました:

http://gist.github.com/3168909

誰か提案がありますか?ありがとう!

4

2 に答える 2

4

この問題に対処する簡単な方法は、1 バイトの unsigned char を使用してブール型を格納することです。h5py では、次を呼び出すことでブール配列を格納できます。

import h5py
import numpy as np

# Generate some boolean data

shape = (100, 100)
data = np.zeros(shape, dtype=np.bool)

# Save the boolean data as uchars

f = h5py.File('foo.h5')
dset = f.create_dataset('/bar', dtype='u1', shape=shape)
dset[:] = data[:]

C/C++ では、uchars をbool*配列に読み込むことができ、それらは正しく解釈されます。これは、C/C++ ブール値と同様に 1 バイトであり、C/C++ ではゼロ以外のビットを持つものはすべて として解釈されるためtrueです。

于 2013-10-16T19:59:09.020 に答える
2

解決策が見つかりました。hdf5 で列挙型を作成する必要があります。

#define CPTR(VAR,CONST) ((VAR)=(CONST),&(VAR))
hid_t boolenumtype = H5Tcreate(H5T_ENUM, sizeof(bool));
status = H5Tenum_insert(boolenumtype, "FALSE",   CPTR(val, FALSE ));
printf ("H5Tenum_insert (FALSE): %i\n", status);
status = H5Tenum_insert(boolenumtype, "TRUE",   CPTR(val, TRUE ));
printf ("H5Tenum_insert (TRUE): %i\n", status);

それを memtype に追加します。

H5Tinsert (memtype, "FLAG", HOFFSET (pointing_t, FLAG),  boolenumtype);

github の例が機能するようになりました。

于 2012-07-24T11:01:11.743 に答える