- 积分
- 3638
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-10-21
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 15195775117 于 2021-1-27 09:45 编辑
前2个月,为了把IDL写的功能做成PyQt的软件,我花了一周时间把一个项目的IDL代码翻译成python代码,总结了一些常用代码的互译。
IDL与python语法对比 | | IDL | python | 检索文件夹 | file_search('C:\H_Scan\2020*P',/test_directory) | from glob import glob
folds=glob(r'C:\H_Scan\2020*P')
| 检索文件 | file_search(path+'H_Scan\*2020*.txt') | from glob import glob
files=glob(r'C:\H_Scan\2020*P.txt') | 删除文件 | file_delete(file) | os.remove(file) | 文件是否存在 | file_test(fold+'grid_data.sav') | os.path.isfile(path+r'\grid.dat')
或os.path.exists(file) | 文件夹是否存在 | file_test(fold+'grid_data') | os.path.isdir(path+r'\grid.dat') | 函数查询 | ?XXX | XXX?或?XXX,对于函数f,f??会显示源码 | 多行并一行 | print,1&print,2&print,3 | print(1);print(2);print(3) | 排序 | sort(返回值是索引) | np.sort的返回值是元素,np.argsort的返回值才是索引
import numpy as np
x=[5,6,4,2,9]
x=np.array(x)
p=np.argsort(x)
print(p)#[3 2 0 1 4] | 寻找 | p=where(x gt 1 and x lt 99 and x ne 49,count);返回索引 | p=np.where(x>10&x<20);print(x[p])返回索引 | 保存变量 | IDL保存数据和函数的二进制的文件是sav格式,写sav:
save,data,filename=fold+'data.sav'
加载sav:restore,'.\fold.sav' | 与sav格式对应的是pickle;读:
f=open(fold+r'\data.dat','wb')
pickle.dump(data,f)
f.close()
写:f=open('data.dat','rb')
data=pickle.load(f)
f.close() | 文本文件行数 | file_lines(file) | 读过才知道行数readlines | 单精度浮点索引序列 | fltarr(5,8) | x=np.arange(0.0,6.0)
x=x.reshape(2,3)
print(x)
# [[0 1 2]
# [3 4 5]] | 整型索引序列 | intarr(n) | 求文件大小 | x=file_info(file);print(x.size);单位bit,除以1024才是单位kb | os.path.getsize(file) | 读格式化文本文件 | a=read_ascii(file,DELIMITER=';',data_start=6,header=head)
x=a.field1 | | 输出运行时间 | 文件首尾分别加tic和toc | 2次调取当前时间来实现datetime.now() | 数组上下堆叠 | x=[[1,2],[3,4]] | x=np.vstack(([1,2],[3,4])) | 数组左右合并 | x=[a,b] | x=np.hstack((a,b)) | 从完整路径获得文件名和目录 | file_basename(file),file_dirname(file) | os.path.basename(file),os.path.dirname(file) | 时间格式 | 儒略日julday(12,31,2020,23,59,59);月日年时分秒;单位1代表1天 | datetime(2020,12,31,23,59,59);单位1代表1秒;起始时间不是儒略日 | 结构体/字典 | x={a:1,b:2,c:'xxx'} | {'存在缺失的O3的8小时平均序列':x,'纬度':x,'值':x}
python的字典比IDL的结构体好用些,它的键是字符串形式,这是个好设计,等于用字符串代替变量名了,对于很难用英文实现“见名知意”的变量是福音 | 等值线图函数 | contour | plt.contour只画等值线,plt.contourf才会填充 | 设置色条 | rgb_table=13 | cmap='rainbow' | 时间轴格式 | xtickFORMAT='(C(CMOi,"月",CDI,"日",CHI,":00"))' | x轴数据用datetime格式,轴会自动设置好 | print不换行 | for i=0,10 do begin
print,format='($,a)',strtrim(string(i),2)
endfor
输出:012345678910IDL> | print ('abc',end='') | 字符串内换行 | print,'A'+string(10B)+'B' | print('A\nB') | 终止程序 | stop | sys.exit(0) | 函数中断 | | 拆分字符串 | strsplit(somestring,’;’,/extract) | somestring.split(’;’) | 合并字符串 | strjoin(['A','B','C'],'-');结果A-B-C | '-'.join([’A’,’B’,’C’]) | 求数组元素个数 | n_elements(x);IDL的一维数组叫向量 | len(x)的返回值是行数 | 求字符串字符个数 | strlen('123') | len('abc') | 求数组维度 | size(x);返回值的第一个是维度数 | x.ndim;x是numpy型 | 数字转字符串 | IDL把数字装字符串有些麻烦,会多出空格来,需要清除:
strtrim(string(999),2) | str(999) | 精度问题 | IDL的浮点型时间必须用双精度time=dblarr(10),不然时间不准;经纬度同样;for循环用小数,最后一个循环可能失效,因为1.1可能会当做1.09999999...或1.1000001...
for i=0.01,1,0.01 do begin ...endfor | python的浮点型自动双精度 | 数组元素类型 | IDL的数组元素必须是同一类型 | [1,2,'a'];元素可以是不同类型 |
|
|