1

HDF5サンプルコードで同様の質問を見つけました
が、hdf5データセットの内容を正しく表示できません。

私が見ているデータセットには、最初の列に文字列があり、他の列には2倍の文字列ヘッダーが含まれています。

私のコードは次のようになります。

public static void readh5(string path, string filename)
{
    H5.Open();
    var fileID = H5F.open(path + filename, H5F.OpenMode.ACC_RDONLY);

    var groupID = H5G.open(fileID, "/Example Group/");
    var datasetID = H5D.open(groupID, "Events");
    var dataSpace = H5D.getSpace(datasetID);
    var size = H5S.getSimpleExtentDims(dataSpace);
    var dataType = H5D.getType(datasetID);

    double[,] dataArray = new double[size[0],11];
    var wrapArray = new H5Array<double>(dataArray);
    H5D.read(datasetID, dataType, wrapArray);
    Console.WriteLine(wrapArray);
}

デバッグしてwrapArrayを調べると、各要素の値が10^300から10^-300までの非常に大きいまたは小さい倍であり、その理由はわかりません。それらは要素のID番号ではないと思います。wrapArrayとdataArrayのデータ型をオブジェクトに変更しようとしましたが、それでもデータセットの正確な内容がわかりません。

wrapArrayに対して取得する出力は次のようになります。

[0,0] 4.0633928641260729E+87  
[0,1] 9.77854726248995E-320  
[0,2] 1.52021104712121E-312  

しかし、私が欲しいのは:

[0,0] Event1  
[0,1] 2  
[0,2] 56  

データセットを読み込んだ後、最初の列をループして特定の文字列を見つけ、他の列の対応する要素を取得します。しかし、私はこれを理解する必要があります。

4

2 に答える 2

0

私にとっては、(HDFView を使用して) DataSet の実際のデータ型をチェックし、double ではなくそのデータ型を含む配列を作成するだけで機能しました。

于 2013-07-02T14:28:20.720 に答える
0

ジョン、データセットに文字列値で満たされた 1 つの列と double 値で満たされた 2 番目の列がある場合、データセットは「COMPOUND」タイプで作成されます。その場合、物事は少し複雑になり、(今日知っていることから..私はHDF5の初心者です)単純に値を2D配列にロードすることはできません。代わりに、次のことを行う必要があります。

//1) Define byte array in memory. We know that it is one string and two doubles. 
//Check that string in dataset is really 256 chars long.
 int rows = size[0]; //this should be number of rows in dataset. 
 int oneRowDataSize = 256+8+8; //string+double+double 
 byte[] data_to_read = new byte[oneRowDataSize * rows];

// 2) Read data to our byte array
 H5D.read(datasetID, dataType, new H5Array<byte>(data_to_read));

 // 3) Decompose our byte array to rows and individual values
 for (int m = 0; m < rows; m++)
  {

 //4) offset of the row in the byte array
      int pos = m*oneRowDataSize;

 //5) compute individual offsets
      int posString = pos;
      int posDouble1 = pos + 256; //change the 256 to the correct size of string in dataset
      int posDouble2 = pos + 256 + 8;

 //6) convert bytes to values
     string valString = Encoding.UTF8.GetString(data_to_read, posString, 256);
     double valDouble1 = BitConverter.ToDouble(data_to_read, posDouble1);
     double valDouble2 = BitConverter.ToDouble(data_to_read, posDouble2);

//7 And use these values for your csharp lists/arrays...

  }

このコードはテストしていません。あなたのケースのために私のものから書き直されたばかりです。これが役立つことを願っています。

フィリップ

于 2015-04-22T20:52:45.480 に答える