2016-04-17 12 views
0

フローデータを読み込み、最終プロットのためにデータをグリッドファイルに配布しようとしています。私は処理のためのMATLABコードを持っており、正常に動作します。私はこのコードをPythonに移植する必要がありますが、私は初心者です。デバッグ時に常にクラッシュする、誰かが私が間違っていることを教えてもらえますか?前もって感謝します!バイナリデータを読み込んでグリッドファイルPythonでデータを配布する

データファイル(合計で100メガバイト程度):

https://www.dropbox.com/sh/3gtsmatq56pm0gc/AADUnNLjdrELjvdUy4wtDiiBa?dl=0

MATLABコード

%% Read Grid grid file is used as a guide for the positon where data is put 
fid = fopen('FLOW_phys_GRID_1.xyz', 'r'); 

a = fread(fid, 3, 'int'); 

Nx = a(1); % number of points in x direction 
Ny = a(2); % number of points in y direction 
Nz = a(3); % numebr of points in z direction 

xx = fread(fid, Nx*Ny*Nz, 'float'); 
yy = fread(fid, Nx*Ny*Nz, 'float'); 

xx = reshape(xx, [Nx, Ny]); 
yy = reshape(yy, [Nx, Ny]); 

fclose(fid); 

x = squeeze(xx(:,1)); 
y = squeeze(yy(1,:)); 

%% Read Data 

fid = fopen('FLOW_phys.raw', 'r'); %flow data in binary format 

a = fread(fid, 3, 'int'); 

Nx = a(1); % number of points in x direction 
Ny = a(2); % number of points in y direction 
Nz = a(3); % number of points in z direction 

Ma = fread(fid, 1, 'float'); 
some_num = fread(fid, 1, 'float'); 
Re = fread(fid, 1, 'float'); 
time = fread(fid, 1, 'float'); 

xx1 = fread(fid, 2*Nx*Ny*Nz, 'float'); 
xx1 = reshape(xx1, [Nx, 2*Ny, Nz]); 

fclose(fid); 

[XX, YY] = meshgrid(x, y); 

% plot (squeeze(xx1(2,:,1))); 
h = pcolor(XX, YY, squeeze(xx1)'); 
set(h, 'EdgeColor', 'none'); 
colorbar 

Pythonコード:

import struct 
import numpy 
import matplotlib 

unpackformat_int = '<i' 
unpackformat_flo = '<f' 


fid = open('FLOW_phys_GRID_1.xyz', 'r+') 

Nx = struct.unpack(unpackformat_int,fid.read(4))[0] 
Ny = struct.unpack(unpackformat_int,fid.read(4))[0] 
Nz = struct.unpack(unpackformat_int,fid.read(4))[0] 

aa = Nx*Ny*Nz 

xx = struct.unpack('i'*aa, fid.read(aa*4))[0] 
yy = struct.unpack('i'*aa, fid.read(aa*4))[0] 

xx = xx.reshape([Nx, Ny]) 
yy = yy.reshape([Nx, Ny]) 

fid.close() 

fid = open('FLOW_phys.raw', 'r+') 

Nx = struct.unpack(unpackformat_int,fid.read(4))[0] 
Ny = struct.unpack(unpackformat_int,fid.read(4))[0] 
Nz = struct.unpack(unpackformat_int,fid.read(4))[0] 

Ma = struct.unpack(unpackformat_flo, fid.read(4))[0] 
some = struct.unpack(unpackformat_flo, fid.read(4))[0] 
Re = struct.unpack(unpackformat_flo, fid.read(4))[0] 
time = struct.unpack(unpackformat_flo, fid.read(4))[0] 

bb = Nx*Ny*Nz 

xx1 = struct.unpack('f'*bb, fid.read(bb*4))[0] 
xx2 = struct.unpack('f'*bb, fid.read(bb*4))[0] 

xx1 = xx1.reshape([Nx, Ny, Nz]) 
xx2 = xx2.reshape ([Nx, Ny, Nz]) 


fid.close() 

[XX, YY] = numpy.meshgrid(xx, yy) 

matplotlib.plot(XX,YY,xx2) 
+0

ようこそスタックオーバーフロー。現時点では、あなたが読んでいるファイルの構造の例を提供していないので、この質問に答えることは可能ではないと思います。何とか抜粋を出すことができますか? Pythonコードのセミコロンは、あなたがそれらのポイントで苦労していると思うようになります(それらは必要ないので、Matlabから来ていると思います)。また、もっと冗長である必要があります。 – roganjosh

+0

@roganjosh ! MATLABはエンジニアリング用の便利なツールです。しかし、私は特定のプロジェクトのPythonスクリプトを実行する必要があります。 – Max

+0

ようこそスタックオーバーフロー。 [mcve]をチェックしてください。実際には避けられない限り、100 MBのファイルをダウンロードするのは理想的ではありません。 – roadrunner66

答えて

2

それが困難である特定のエラーメッセージなし教えてください。しかし、私は一連の可能性のある問題を抱えています。

まず:

fid = open('FLOW_phys_GRID_1.xyz', 'r+') 

これは、 "バイナリ読み" を意味し、'rb'でなければなりません。これはバイナリファイルであり、テキストファイルではありません。 'r+'は「読み書き」を意味しますが、あなたは書いていません。また、完了したら自動的にファイルを自動的に閉じますので、常にwith open('FLOW_phys_GRID_1.xyz', 'r+') as fid:を使用してください。

また、MATLABオープンファイルは、MATLABインタプリタへのファイルを識別する特殊な番号で表されます。しかし、Pythonではそれは別個のオブジェクトなので、これをあなたの頭に入れておくと、fidの代わりにfobjを変数名として使うとよいでしょう。

次へ:MATLABで

xx = struct.unpack('i'*aa, fid.read(aa*4))[0] 
yy = struct.unpack('i'*aa, fid.read(aa*4))[0] 

、あなたはfloatとしてこれを読んで、しかし、Pythonで、あなたは整数としてそれを読み込みます。さらに重要なのは、aaの数字で読んでいますが、[0]は最初の番号しか保持していません。 MATLABでは、それらのすべてを保持します。

次へ

xx = xx.reshape([Nx, Ny]) 
yy = yy.reshape([Nx, Ny]) 

unpackは、本質的に一次元であるタプルを返します。 reshapeメソッドはありません。これはnumpy配列にはありますが、pythonリストやタプルではありません。 xxyyxx = np.array(xx).reshape([Nx, Ny])のようなものを使用してnumpy配列に変換するか、またはxx = np.fromfile(fid, dtype='float', count=aa)のようにnumpyのfromfileを使用する方がよいでしょう。これは、numpyの配列としてデータを直接読み込みます。

実際、私はどこでもそれを使用することをお勧めします。 NxNyNzの部分はNx, Ny, Nz = np.fromfile(fid, dtype='i', count=3)に簡略化することができます。その構文は実際にはunpackでも動作しますが、ファイルを扱うときにはnumpyのアプローチはやや簡単です。

また、次元の順序はnumpyとMATLABで異なります。 numpy(デフォルトでは)はCプログラミング言語の配列から派生した順序を使用しますが、MATLABはFortranプログラミング言語の順序を排他的に使用します。したがって、MATLABと同じようにPythonで同じ配列形状を取得するには、最初の軸を逆にする必要があります。reshape([Ny, Nx])、またはそれ以降はreshape([Ny, Nx, Nz])です。 が常に1の場合にのみ機能します。それ以外の数値であれば、MATLABでも失敗します。

MATLABコードから次に:

x = squeeze(xx(:,1)); 
y = squeeze(yy(1,:)); 

あなたはPythonでこれを行うことはありません。それはまた、Pythonで、次の部分は、あなたがMATLABで行うものとは異なることを意味する:

[XX, YY] = numpy.meshgrid(xx, yy) 

次へ:

bb = Nx*Ny*Nz 

xx1 = struct.unpack('f'*bb, fid.read(bb*4))[0] 
xx2 = struct.unpack('f'*bb, fid.read(bb*4))[0] 

をMATLABでは、あなたは2*Nx*Ny*Nzを読みますが、Pythonでは次の2つの異なるアレイへNx*Ny*Nzを読みますあなたは1つに戻って結合することはありません。つまり、PythonではMATLABとは異なるものをプロットしています。また、squeezeを決して使ったり、numpy配列を転置したりしないでください。最後に

matplotlib.plot(XX、YY、XX2)

まず、あなたはPythonでMATLABでpcolorが、plotを行っています。これらは全く異なっています。 matplotlibにはMATLABのようにpcolorがあるので、それを使用してください。

第2に、matplotlib.plotのようなものはありません。 from matplotlib import pyplot、次にpyplot.plotのようにする必要があります。次に実際にプロットを表示するにはpyplot.show()を実行する必要があります。しかし、通常は、短縮するためにimport matplotlib.pyplot as plt(およびimport numpy as np)を実行するのが一般的です。

スクリプトではなく対話的に行う場合は、plt.ion()を実行して、プロットをすぐに表示することができます(または、IPythonシェルを使用し、%matplotlibを使用する方が良い)。しかし、スクリプトでは、すべての書式設定が完了した後にplt.show()に電話する必要があります。

ここでは、あなたがやっていることを(おおまかに)実装する方法を説明します。私がテストするサンプルファイルを持っていないので、それは正確に適切に動作しない可能性があり、うまくいけば、あなたが始めるために十分である:

import numpy as np 
import matplotlib.pyplot as plt 


with open('FLOW_phys_GRID_1.xyz', 'rb') as fobj: 
    Nx, Ny, Nz = np.fromfile(fobj, 'int32', 3) 
    x = np.fromfile(fobj, 'float32', Nx*Ny*Nz).reshape(Ny, Nx, Nz)[:, 0, 0]) 
    y = np.fromfile(fobj, 'float32', Nx*Ny*Nz).reshape(Ny, Nx, Nz)[0, :, 0] 

with open('FLOW_phys.raw', 'rb') as fobj: 
    Nx, Ny, Nz = np.fromfile(fobj, 'int32', 3) 
    xx1 = np.fromfile(fobj, 'float32', 2*Nx*Ny*Nz).reshape(2*Ny, Nx, Nz).squeeze().T 

plt.pcolor(*np.meshgrid(x, y), xx1) 
plt.show() 
関連する問題