【发布时间】:2014-06-16 03:15:05
【问题描述】:
我在 IDL 中有一个脚本,它读取未格式化的二进制文件 (F77) 并将其输出为 .sav 文件,但我想将此脚本转换为 python 并另存为 .npz 文件,但我在读取时遇到问题行。
IDL 代码:
;create save file for QBO model output
;---------------------------------------------------------------------
;input data here (Only adjust this info)
;---------------------------------------------------------------------
time=7300 ;duration from fortran code
tstep=5 ;time step from fortran code
inputfile='/home/cwilliams/Metr_205/qbo/uvwtom.'; binary file from fortran
outputsavefile='~cwilliams/Metr_205/qbo/qbo_FULLX.sav'; name of save file with variables
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;==============================================================================
; Do Not Adjust the Following Code
;==============================================================================
fname='dat'
nstep=time/tstep ;time/timestep
nm=nstep-1
um=fltarr(17,34)
vm=fltarr(17,34)
wm=fltarr(17,34)
tm=fltarr(17,34)
pm=fltarr(17,34)
om=fltarr(17,34)
vpm=fltarr(17,34)
vdm=fltarr(17,34)
u=fltarr(17,34,nstep)
v=fltarr(17,34,nstep)
w=fltarr(17,34,nstep)
temp=fltarr(17,34,nstep)
pressure=fltarr(17,34,nstep)
ozone=fltarr(17,34,nstep)
date=findgen(nstep)*(2.*tstep/365.)
ulevels2=[-30, -25, -20, -15, -10, -5, 5, 10, 15, 20, 25, 30]
ulevels3=findgen(15)*3.-12
lab=findgen(20)*0+1
lat=findgen(17)*2.7-1.35
ht=findgen(34)*0.5+17.
openr,37,inputfile+fname,/f77_unformatted & title='base'
for n=0,nm do begin
readu,37,um,vm,wm,tm,om,pm
u(*,*,n)=um/100.
v(*,*,n)=vm
w(*,*,n)=wm
temp(*,*,n)=tm*700000./2.87e6
pressure(*,*,n)=pm/10000.
ozone(*,*,n)=om
endfor
close,37
save,filename=outputsavefile,u,v,w,temp,pressure,ozone,date,ulevels2,ulevels3,lab,$
lat,ht
stop
end
Python 代码: #为QBO模型输出创建保存文件
#---------------------------------------------------------------------
#input data here (Only adjust this info)
#---------------------------------------------------------------------
time=7300 #duration from fortran code
tstep=5 #time step from fortran code
inputfile='/home/cwilliams/metr51/lab12/uvwtom.dat'# binary file from fortran
outputsavefile='~cwilliams/metr51/lab12/qbo_FULLX.sav'# name of save file with variables
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
import numpy as n
#==============================================================================
# Do Not Adjust the Following Code
#==============================================================================
nstep=time/tstep #time/timestep
nm=nstep-1
um=n.empty((17,34))
vm=n.empty((17,34))
wm=n.empty((17,34))
tm=n.empty((17,34))
pm=n.empty((17,34))
om=n.empty((17,34))
vpm=n.empty((17,34))
vdm=n.empty((17,34))
u=n.empty((17,34,nstep))
v=n.empty((17,34,nstep))
w=n.empty((17,34,nstep))
temp=n.empty((17,34,nstep))
pressure=n.empty((17,34,nstep))
ozone=n.empty((17,34,nstep))
date=n.arange(nstep)*(2.*tstep/365.)
ulevels2=n.array([-30, -25, -20, -15, -10, -5, 5, 10, 15, 20, 25, 30])
ulevels3=n.arange(15)*3.-12
lab=n.arange(20)*0+1
lat=n.arange(17)*2.7-1.35
ht=n.arange(34)*0.5+17.
这是我需要帮助的地方:
f=open(inputfile,'rb')
data=f.read()
for i in range(nm+1):
# readu,37,um,vm,wm,tm,om,pm
# u(:,:,i)=um/100.
# v(:,:,i)=vm
# w(:,:,i)=wm
# temp(:,:,i)=tm*700000./2.87e6
# pressure(:,:,i)=pm/10000.
# ozone(*,*,n)=om
#
#n.savez(filename=outputsavefile,u=u,v=v,w=w,temp=temp,pressure=pressure,ozone=ozone,date=date,ulevels2=ulevels2,ulevels3=ulevels3,lab=lab,lat=lat,ht=ht)
我知道 IDL 和 Python 之间的行/列顺序存在问题,但我想我可以在读入代码后解决这个问题。
【问题讨论】:
-
你遇到了什么麻烦?
-
@george 我看到了那个帖子,但它没有帮助,因为我正在阅读具有多个维度的多个变量。
-
@VladimirF 我需要将最后一个(代码)部分从 IDL 转换为 python 的帮助
-
我的答案中的代码非常接近您的需要。您需要知道数据类型(示例中为 float32)并进行一些循环。我不知道 idl 所以我不能确切地知道它在做什么。
标签: python-2.7 fortran idl-programming-language