我一直在尝试将存储为 numpy 数组的数据导出到 GrADS-flat 二进制文件。似乎 GrADS 无法识别 .ctl 文件中给出的 Z 维度。无论我为“设置 z 整数”使用什么值,GrADS 都只显示第一级。
这是我的问题的最小再现
我的python代码:
import numpy as np
from array import array
data = np.linspace(1, 60, num=60, endpoint=True)
data = np.reshape(data, [5, 4, 3])
print(data)
with open('temp.dat', 'ab') as wf:
float_array = array('f', data.flatten())
float_array.tofile(wf)
wf.close()
执行此操作会将数字 [1, 2, 3, ..., 60] 作为单精度浮点数写入二进制文件
我的 .ctl 文件:
DSET ^temp.dat
TITLE title
UNDEF -9.99E33
XDEF 3 LINEAR 0.0 1
YDEF 4 LINEAR 0.0 1
ZDEF 5 LEVELS 0 1 2 3 4
TDEF 1 LINEAR 0Z10apr1991 12hr
VARS 1
var 0 99 some var
ENDVARS
这组 .dat 和 .ctl 文件按预期将前 12 个数字显示为字段的第一级。
ga-> open temp.ctl
Scanning description file: temp.ctl
Data file temp.dat is open as file 1
LON set to 0 2
LAT set to 0 3
LEV set to 0 0
Time values set: 1991:4:10:0 1991:4:10:0
E set to 1 1
ga-> set digsize 0.6
digsiz = 0.6
ga-> set lon -1 3
LON set to -1 3
ga-> set lat -1 4
LAT set to -1 4
ga-> set gxout grid
ga-> d var
但是,如果我尝试“设置 z 2”,它仍然显示第一级。 Orelse,var(z=3) 和 var(z=1) 是
var(z=1)=
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[10. 11. 12.]]
var(z=3)=
[[25. 26. 27.]
[28. 29. 30.]
[31. 32. 33.]
[34. 35. 36.]]
这应该显示“24”的常量字段......但GrADS显示“0”,好像z = 3与z = 1相同。
ga-> c
ga-> d var(z=3) - var(z=1)
更让人无法理解的是,如果我在 .ctl 文件中给出 var2,毕业生们会认为 var2(z=1) 应该是 var2(z=1)!
我知道除了 GrADS 之外还有很多更好的可视化工具,但我想使用遗留的 GrADS 代码,所以这是不可避免的。
我是否以错误的顺序编写了二进制文件?或者二进制文件是否缺少标题或分隔符或什么?如果有人知道为什么会这样,我就是研究生。提前致谢。