使用不同的扫描方向导入二进制数据

2024-10-03 02:37:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个C代码,可以计算二维空间上的一些物理变量(例如,x-velocity“u”和y-velocity“v”,其中“u”和“v”是空间坐标“x”和“y”的函数:“u=u(x,y)”和“v=v(x,y)”)。你知道吗

然后将结果导出到二进制文件中(数据类型为“double”)。然后用python脚本打开数据文件,以便进行一些后处理,并使用matplotlib绘制数据。你知道吗

如您所知,扫描二维阵列有两种方法:

  • 首先选择一行并扫描行中的每个单元格
  • 或者做完全相反的操作:首先选择一列并扫描列中的每个单元格

显然,我面临一个问题,即C代码保存数组的方向与python脚本读取数组的方向不同。你知道吗

C文件使用fwrite()函数,我希望保持原样。你知道吗

fwrite(vect , sizeof(double), nbcols*nbrows, file);

python文件使用struct模块解压数组:

unpackFormat = '%dd' % nDim
zx = np.array([struct.unpack(unpackFormat,f.read())]).reshape(v.N,v.M)

在我的特殊情况下,我可以找到一个解决办法,但它是丑陋的,可能不适用于所有情况。所以我的问题是:有没有什么方法可以将数组解包,以便在默认方向以外的其他方向进行扫描?你知道吗

我的数组只包含double,如果我理解正确,array.fromfile可以处理这种情况,因此如果您碰巧知道array.fromfile的答案,请随意分享!你知道吗


关于我这个案子的额外信息

在下面,我将提供更多针对我的问题的细节,尽管我刚才所表达的应该足以让你理解我的问题。注意:下面将有一些numpy+matplolib,尽管我的问题更多地与struct模块有关,而不是与matplotlib有关。你知道吗

我想做的是速度场的颤动图。这意味着我要绘制一个“箭头场”,如[here][1]所示,其中点(x,y)上的箭头对应于向量(u(x,y),v(x,y))。以下是我剧本中有趣的部分:

# gen x,y coordinates
y, x = np.mgrid[0:1:complex(0,v.N),
                0:1:complex(0,v.M)]

# load data for the x-direction
f = open(filePathX, 'rb')
unpackFormat = '%dd' % nDim
zx = np.array([struct.unpack(unpackFormat,f.read())]).reshape(v.N,v.M)
f.close()

# load data for the y-direction
f = open(filePathY, 'rb')
unpackFormat = '%dd' % nDim
zy = np.array([struct.unpack(unpackFormat,f.read())]).reshape(v.N,v.M)
f.close()

# plotting
plt.quiver(x[::10,::10], y[::10,::10], zx[::10,::10], zy[::10,::10])

在这个脚本中,绘图不是很好:就好像输出向量zx和zy的x和y坐标被交换了一样。换句话说,每个箭头对应于向量(v,u),而不是向量(u,v)。我将此归因于struct.unpack以我希望的另一个方向读取数组。你知道吗

在我的特殊情况下,我跳向一个旋转速度场,但是箭头不是指向X轴就是指向Y轴。你知道吗

重要精度:Matplotlib不允许交换x和y数组。你知道吗

解决方法是执行以下操作:

plt.quiver(x[::10,::10], y[::10,::10], -zy[::10,::10], -zx[::10,::10])

但我不喜欢这样做,所以我希望你能提出一个更好的方法来解决我的问题

提前谢谢!你知道吗


Tags: 文件方法np情况数组箭头方向array
1条回答
网友
1楼 · 发布于 2024-10-03 02:37:01

愚蠢的我找到了答案:

用途:

zx = np.array([struct.unpack(unpackFormat,f.read())]).reshape(v.N,v.M,order='F')

而不是:

zx = np.array([struct.unpack(unpackFormat,f.read())]).reshape(v.N,v.M)

这样做会改变读取数组的方式。实际上问题不是来自struct.unpack,而是来自np.array.reshape。后者有一个可选参数来设置扫描方向。在这里,我为“fortran”扫描约定选择了F选项(即使我的数据是用C代码保存的),而不是默认的C值(对于C扫描约定)。你知道吗

我想我必须从一开始就以一种奇怪的方式将数组存储在我的C代码中,因此我需要以一种非常规的方式读取它们。仍然困扰着我,但至少它的脚本看起来干净。你知道吗

相关问题 更多 >