Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取二进制数据并在网格文件Python中分发数据_Python_Matlab_Numpy_Matplotlib_Binary - Fatal编程技术网

读取二进制数据并在网格文件Python中分发数据

读取二进制数据并在网格文件Python中分发数据,python,matlab,numpy,matplotlib,binary,Python,Matlab,Numpy,Matplotlib,Binary,我正在尝试读取流量数据,并将数据分发到网格文件中以进行最终绘图。我有一个MATLAB代码进行处理,它的工作成功。我需要将这段代码转换成Python,但我是个初学者。调试时它总是崩溃,有人能告诉我我做错了什么吗?提前谢谢 数据文件(总计约100mb): MATLAB代码 %% Read Grid grid file is used as a guide for the positon where data is put fid = fopen('FLOW_phys_GRID_1.xyz', '

我正在尝试读取流量数据,并将数据分发到网格文件中以进行最终绘图。我有一个MATLAB代码进行处理,它的工作成功。我需要将这段代码转换成Python,但我是个初学者。调试时它总是崩溃,有人能告诉我我做错了什么吗?提前谢谢

数据文件(总计约100mb):

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)
导入结构
进口numpy
导入matplotlib

unpackformat_int='如果没有特定的错误消息,很难判断。然而,我看到了一系列可能的问题

第一:

fid = open('FLOW_phys_GRID_1.xyz', 'r+')
这应该是
'rb'
,意思是“读取二进制”。这是一个二进制文件,不是文本文件<代码>'r+'
的意思是“读和写”,但你不是在写。此外,您应该始终使用
和open('FLOW\u phys\u GRID\u 1.xyz','r+')作为fid:
,因为这样会在您使用完文件后自动安全地关闭该文件

此外,在MATLAB中,打开的文件由特殊的数字表示,这些数字向MATLAB解释器标识文件。然而,在Python中,它们是不同的对象,因此为了更好地记住这一点,最好使用
fobj
而不是
fid
作为变量名

下一步:

在MATLAB中,您将其作为浮点读入,但在python中,您将其作为整数读入。更重要的是,虽然您正在读取
aa
数字,但
[0]
只保留第一个数字。在MATLAB中,您可以保存所有这些

下一步:

unpack
返回元组,元组本质上是一维的。它没有
reformate
方法,这是numpy数组所拥有的,而不是python列表或元组。您需要使用类似于
xx=np.array(xx)的东西将
xx
yy
转换为numpy数组。重塑([Nx,Ny])
,或者更好地使用numpy的
fromfile
,例如
xx=np.fromfile(fid,dtype='float',count=aa)
。这将直接以numpy数组的形式读取数据

事实上,我建议你在任何地方都使用它。您获得的
Nx
Ny
Nz
部分可以简化为
Nx,Ny,Nz=np.fromfile(fid,dtype='i',count=3)
。这种语法实际上也适用于
unpack
,但在处理文件时,numpy方法要简单一些

此外,numpy和MATLAB中的尺寸顺序也不同。numpy(默认情况下)使用从C编程语言数组派生的顺序,而MATLAB专门使用Fortran编程语言的顺序。因此,要在Python中获得与在MATLAB中相同的数组形状,您需要将第一个数组形状反转为轴,因此
重塑([Ny,Nx])
,或者以后
重塑([Ny,Nx,Nz])

此外,仅当
Nz
始终为1时,此选项才有效。如果它是任何其他数字,即使在MATLAB中也会失败

接下来,从MATLAB代码:

x = squeeze(xx(:,1));
y = squeeze(yy(1,:));
在Python中永远不会这样做。这也意味着Python中的以下部分与MATLAB中的不同:

 [XX, YY] = numpy.meshgrid(xx, yy)
下一步:

在MATLAB中,您可以读取
2*Nx*Ny*Nz
,但在Python中,您可以将
Nx*Ny*Nz
读入两个不同的数组中,而这两个数组永远不会合并成一个数组。这意味着您在Python中绘制的东西与在MATLAB中绘制的东西不同。您也从不挤压或转置numpy数组

最后:

matplotlib.plot(XX,YY,xx2)

首先,您在MATLAB中执行
pcolor
,但在Python中执行
plot
。这是完全不同的。matplotlib与MATLAB一样具有
pcolor
,因此请使用它

其次,没有
matplotlib.plot
这样的东西。您需要执行类似于从matplotlib导入pyplot的
操作,然后执行
pyplot.plot
。然后需要执行
pyplot.show()
来实际显示绘图。但是,通常惯例是将matplotlib.pyplot导入为plt(将numpy导入为np)以缩短时间

如果以交互方式而不是在脚本中执行此操作,则可以执行
plt.ion()
以立即显示绘图(或者更好地使用IPython shell并使用
%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()

欢迎来到堆栈溢出。目前我不认为有可能回答这个问题,因为你没有提供你正在阅读的文件结构的示例-你能提供一个摘录吗?Python代码中的分号让我觉得您在这些点上遇到了困难(它们不是必需的,所以我认为它们来自Matlab),而且它似乎比需要的更冗长be@roganjosh非常感谢!MATLAB是一个方便工程人员使用的工具。但是我必须为一个特定的项目运行Python脚本。请注意,下载一个100 MB的文件并不理想,除非它真的无法避免。@roganjosh我用Python的方式编写它是困难的还是我做错了什么?无论如何,谢谢你的帮助。@roadrunner66谢谢你的评论。事实上,我不认为下载是必要的。由于代码是从MATLAB传输过来的,由于MATLAB和Python之间的命令不同,似乎出现了一些结构错误。
 [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]
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()