2016-03-31 19 views
-1

merg_2015041312_4km-pixel.Zという名前のFortranバイナリファイルを読む必要があります(hereから)。圧縮されていないファイルの構造はhereと定義されています。 「正時」の画像(「:00」)のための第1回:と「時間半の」画像(「:30」)のための第二の定義はPythonでFortranバイナリファイルからレコードを読む

各ファイルには、2つのレコードが含まれていることを言います。

各レコードは、各データから「75」を減算することにより、1バイトに収まるようにスケーリングされたIR輝度温度の9896 X 3298 Fortranの配列です。

GrADS .CTLファイルの説明:

DSET merg_1999042012_4km-pixel 
    OPTIONS yrev little_endian template 
    UNDEF 330 
    TITLE globally merged IR data 
    XDEF 9896 LINEAR 0.0182 0.036378335 
    YDEF 3298 LINEAR -59.982 0.036383683 
    ZDEF 01 LEVELS 1 
    TDEF 99999 LINEAR 12z04Apr1999 30mn 
    VARS 1 
    ch4 1 -1,40,1,-1 IR BT (add '75' to this value) 
    ENDVARS 

と私はいくつかのpythonコード書き込もうとしました:

>>> import struct 
>>> file = open("merg_2015041312_4km-pixel", 'rb') 
>>> data = struct.unpack('>h', file.read()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
struct.error: unpack requires a string argument of length 2 

残念ながら、私は、バイナリファイルに慣れていないし...

このファイルから2番目のレコード(半時間ごと)を取得するにはどうすればよいですか?

+0

ええ、私は知っています。私はその内部構造を取得する方法があるかどうか疑問に思っていました...多分、GUIの "hexish"エディタを探してそのように読もうとします。ありがとう。 – urgeo

+0

私はこれを見つけた、それは助けることができる?'DSETのmerg_1999042012_4km画素 \t \t \t OPTIONSは9896 LINEAR 0.0182 0.036378335 \t \t \t YDEF 3298 LINEAR -59.982 0.036383683 \t \t \t \t TITLEグローバルマージ \t \t \t UNDEF LITTLE_ENDIANテンプレートIRデータ \t \t \t XDEFをyrev \t ZDEF 01レベル1 \t \t \t TDEF 99999 LINEAR 12z04Apr1999 30MN \t \t \t VARS 1 \t \t \t CH4 1 -1,40,1、-1 IR BT(この値に '75' を追加) \t \t \t ENDVARS ' – urgeo

+0

は私たちが[これを続けましょうチャットでのディスカッション](http://chat.stackoverflow.com/rooms/107822/discussion-between-ilja-and-urgeo) –

答えて

4

datasetdataset descriptionとテストを読んでから、ファイルが値から75を減算することによって1バイトに収まるように縮小サイズ(9896, 3298)のIRデータの2つのレコードを(圧縮)Fortranのダイレクト・アクセス・ファイルであることは明らかです。 GrADSコントロール定義の経験がないため、結果のバイトが符号なしまたは符号付きであるかどうかは不明です。

numpy.fromfileeasily reading binary Fortran direct-access filesのツールです。

使用するか、あなたの記録data type objectを構築するためにint8またはuint8 DTYPE として、理にかなっている1つのチェック。 の場合データがケルビンのIR温度である場合、uint8を使用すると はスケーリング(〜-87℃〜56.8℃)後に最小186および最大330になります。アップスケーリングのために十分に大きいタイプに アップキャストは、ここでfloatを用い、得られた1次元アレイは寸法及び形状を修正するために再形成されなければならない int16int32

H = 9896 
W = 3298 
Record = np.dtype(('uint8', H*W)) 
A = np.fromfile('merg_2015041312_4km-pixel', 
       dtype=Record, count=2).astype('float') + 75 

とすることができます。データ型オブジェクトはサブ配列をサポートしますが、それらはalways read in C-contiguous memory layoutです。

I_on_the_hour = A[0].reshape((H, W), order='F') # Fortran data order 
I_on_the_half_hour = A[1].reshape((H, W), order='F') 

結果は(ipython --pylabに)まともに見えることを確認し

plt.imshow(I_on_the_half_hour) 
+0

@urgeo私がいなくてもあなたの編集が拒否されたようです。あなたは画像が転置を必要とするという点で正しいです。 –

関連する問題