爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 9347|回复: 6

[混合编程] [已收纳]python2.7调用IDL示例

[复制链接]

新浪微博达人勋

发表于 2020-7-2 21:36:13 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 15195775117 于 2021-2-13 13:46 编辑

1.jpg 2.jpg


# -*- coding: utf-8 -*-
"""
该模块用于python2.7调用IDL
"""
import numpy as np
from idlpy import IDL
#绘制真三维:
fig=IDL.volume(IDL.findgen(50,50,50),rgb_table0=33,title='标题')
#fig.save('999.jpg')
#fig.close()




#克里金插值法:
n=100
seed=-121147L
x = IDL.RANDOMU(seed, n)
y = IDL.RANDOMU(seed, n)
z=IDL.RANDOMU(seed, n)
x2=x[IDL.SORT(x)]
y2=y[IDL.SORT(y)]
xx=0
yy=0
result =IDL.KRIG2D(z,x,y,EXPONENTIAL=[0.5,0.2,1],NX=100,NY=100,xout=xx,yout=yy)
#python2.7中xout和yout不能返回值
#于是我想通过处理x和y,使之尽量接近xout和yout,达到取代的目的
IDL.help(xx)
fig2=IDL.CONTOUR(result,x2,y2,
                fill=1,
                rgb_table=33)
fig2=IDL.PLOT(x[0:-1:3],y[0:-1:3],sym=23,
#              RGB_TABLE=33,
              SYM_FILLED=1,
              sym_fill_color='w',
              sym_size=3,
#              VERT_COLORS=IDL.BYTSCL(z),
              overplot=1)

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-7-2 21:39:12 | 显示全部楼层
操作发现,虽然是2.7的环境,python3的print()写法也是支持的,莫非可以兼容?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-7-3 08:09:51 | 显示全部楼层
看完想哭

寥寥几行代码

当年  欲哭无泪
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-7-3 08:33:03 | 显示全部楼层
15195775117 发表于 2020-7-2 21:39
操作发现,虽然是2.7的环境,python3的print()写法也是支持的,莫非可以兼容?

如果Python可以调用idl,之前的idl代码是不是不需要用Python再写一遍了?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-7-3 09:24:28 | 显示全部楼层
本帖最后由 15195775117 于 2020-7-3 09:28 编辑

python调用IDL,我从网上找到3个包:

1、IDLpy:
IDL的help里内置了

2、pyIDL:
https://pypi.org/project/pyIDL/0.6/
这个还没试过,
网上说:“pyidl是很久之前的包,依赖于numarray。但是,numarray是numpy的前身,现在numarray已经弃用了,使用pip是无法安装的”

3、pIDLy:Github:https://github.com/anthonyjsmith/pIDLy
(以下内容来源:http://blog.sciencenet.cn/blog-3413604-1177710.html)
“虽然它为Python2.6.x写的,但是在Python3.X依然好用~”
“注意:由于pIDLy依赖pexpect包,但是pexpect包的spawm函数在Windows下是不可用的,所以pIDLy只能在Linux和MacOS下运行!!!”

安装:pip install pidly
下载源文件(tar.gz),解压后[python setup.py install ]

pIDLy使用示例:

Usage:
Initiate:
>>> import pidly
>>> idl = pidly.IDL()
Or:
idl = pidly.IDL('/path/to/idl')
Execute commands:
>>> idl('x = total([1, 1], /int)')
Retrieve values:
>>> print(idl.ev('x'))
2
Or (slightly slower):
>>> print(idl.x)
2
Evaluate expressions:
>>> print(idl.ev('x ^ 2'))
4
Use cache (IDL save) to handle large arrays:
>>> idl('x=[1,2,3,4,5,6]')
>>> print(idl.ev('x', use_cache=True))
[1 2 3 4 5 6]
Transfer a list of IDL variables, using cache:
>>> idl('y=[1,2,3,4,5,6]')
>>> xy = idl.ev_list(['x','y'], use_cache=True)
>>> print(sorted(xy.keys()))
['x', 'y']
>>> print(xy['x'])
[1 2 3 4 5 6]
Assign value from Python expression:
>>> idl.x = 2 + 2
>>> print(idl.x)
4
Or:
>>> idl('x', 2 + 2)
>>> print(idl.x)
4
Perform IDL function on Python expression(s):
>>> idl.func('reform', range(4), 2, 2)
array([[0, 1],
[2, 3]])
Or (slightly slower):
>>> idl.reform(range(4), 2, 2)
array([[0, 1],
[2, 3]])
With keywords (/L64 -> L64=True or L64=1)
>>> x = idl.histogram(range(4), binsize=3, L64=True)
>>> print(x)
[3 1]
>>> print(x.dtype)
int64
IDL procedure with Python argument(s):
>>> idl.pro('plot', range(10), range(10), xstyle=True, ystyle=True)
Interactive mode:
>>  idl.interact()
IDL> print, x
4
IDL> ^D
>>>
Close:
>>> idl.close()
pIDLy supports the transfer of:
* ints, longs, ...
* floats, doubles, ...
* strings
* arrays of the above types, with arbitrary size and shape
* dictionaries <-> structures & lists of dicts <-> arrays of structures
but with certain limitations on transfer from Python to IDL
[NB if getting Syntax Errors when passing large arrays to IDL, try using
>>  idl = pidly.IDL(long_delay=0.05)
default is 0.02.]


以上接口是否可用,是否好用,有待测试


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-7-3 09:56:30 | 显示全部楼层
问题少女 发表于 2020-7-3 08:33
如果Python可以调用idl,之前的idl代码是不是不需要用Python再写一遍了?

如果使用IDLpy接口,即便不用完全重新写,但还是需要一定的修改工作。
可以观察,IDLpy接口中,IDL的函数都是作为IDL类的方法存在的,这个就要手工操作一番。


如果接口支持执行脚本(整个脚本翻译),或者逐行执行脚本(逐行翻译),那就省事不少。


比如5楼的pIDLy,观察它的调用方法有这种:idl('x = total([1, 1], /int)'),
这是支持“逐行翻译”的,这种格式的写法,只需要把IDL脚本当做文本,进行字符串批量修改即可。


类似的,Java调用IDL的com.idl.javaidl接口也支持“逐行翻译”,调用方法见我的日志:
http://bbs.06climate.com/home.php?mod=space&uid=43007&do=blog&id=6377




密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-7-3 11:13:39 | 显示全部楼层
15195775117 发表于 2020-7-3 09:56
如果使用IDLpy接口,即便不用完全重新写,但还是需要一定的修改工作。
可以观察,IDLpy接口中,IDL的函 ...

感谢,pIDLy这种确实省事不少
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表