有人使用一种名为Interactive Data Language,IDL的语言吗?它很受科学家欢迎.我认为这是一种糟糕的语言,因为它是专有的(运行它的每个终端必须购买昂贵的许可证)并且它具有最小的支持(尝试搜索IDL,语言,现在在堆栈上).我试图说服我的同事停止使用它并学习C/C++/Python/Fortran/Java/Ruby.有没有人知道甚至关心IDL足以对它有意见?你怎么看呢?我应该告诉我的同事现在不要浪费时间吗?我怎么能说服他们?
编辑:人们会得到我不知道或使用IDL的印象.另外,我说IDL的支持很少,这在某种意义上是正确的,所以我必须澄清科学图书馆确实很大.我一直使用IDL,但这正是问题:我只使用IDL,因为同事使用它.IDL使用的文件格式为.sav,只能在IDL中打开.所以我必须使用IDL来处理这些数据并将数据传回给同事,但我知道我会用另一种语言更有效率.这就像有人在电子邮件附件中向您发送微软word文件,如果您不明白它有多么错,那么您可能会写太多单词而没有足够的代码并且您购买了Microsoft Word.
编辑:作为IDL的替代品,Python很受欢迎.以下是AstroBetter 的IDL优缺点列表(以及缺点):
IDL的优点
IDL的缺点
Python的优点
Python的缺点
我是python的新手,但有一些使用IDL的经验.我想知道是否有人知道在python中是否有与IDL的stop和.reset命令相同的命令.
如果我正在运行一些IDL脚本,我写了一个停止命令,基本上它的作用是停止那里的脚本并让我访问脚本中间的命令行.所以我可以访问我在stop命令之前定义的所有函数和变量,我觉得这对调试非常有用.
我发现.reset命令非常有用.它的作用是重置IDL环境(清除所有变量,函数等).就好像我关闭了那个会话并打开了一个新会话,但无需退出并重新启动IDL.我发现,如果我正在尝试调试脚本,我写它有时从头开始有用,而不必重置IDL(或现在的python).在python中,能够取消导入我之前导入的任何模块也很有用.
任何有关这些问题的帮助将不胜感激.
干杯
我正要为Notepad ++创建一个用户定义的语言文件,以语法高亮IDL.但是在我去创建一个之前,我想与"社区"核实,看看是否有其他人已经准备好了.
有没有人有什么建议?
我在IDL中编写了一个程序,用于根据命令行参数生成散点图.我可以直接在终端中成功调用程序,如下所示:
idl -e"scatterplot_1_2d_file.pro"$ infile $ outfile $ title $ xtitle $ ytitle $ xmin $ xmax $ ymin $ ymax $ timescale
其中$*引用了一些输入的字符串文字.问题是,我以为我只能输入那一行,将变量名代替文字,放入bash脚本,并生成一百万个散点图我在休息时.不幸的是,如果我这样做,我得到错误:
idl:-e选项不能用批处理文件指定
所以我的下一次尝试是尝试将这些命令写入我随后运行的IDL批处理文件.
这种尝试看起来像这样:
#!/bin/bash
indir=/path/to/indir/
outdir=/path/to/outdir/
files=`ls $indir`
batchfile=/path/to/tempbatchfile.pro
echo .r "/path/to/scatterplot_1_2d_file.pro" >> $batchfile
for file in $files
do
name=${file%\.*}
echo scatterplot_1_2d_file $indir$name.txt $outdir$name.jpg $name "Gauge Precipitation (mm)" "NMQ Precipitation (mm)" "*" "*" "*" "*" 2 >> $batchfile
done #done file
echo exit >> $batchfile
idl <<EOF
@/path/to/scatterplot_1_2d_file
EOF
rm $batchfile
Run Code Online (Sandbox Code Playgroud)
我不知道脚本生成的大部分错误是否相关,所以我只是发布开始,如果需要,我会稍后发布其余的:
[foo]$ bash script_thing.sh
IDL Version …Run Code Online (Sandbox Code Playgroud) 如果我有一个带有字段名'fieldname'的结构,是否可以仅使用变量来访问该字段中的数据?
即.
x ='fieldname'
是可以做到的
data = struct.(x)在某种程度上?我想在x中使用字符串作为字段名称.
我可能会以错误的方式解决这个问题,但我正在尝试在循环中定义和填充数组.
for i = 0,39 do begin
xx = long(findgen(n+1l)*sx + line1x[i])
sz = size(xx)
arrayname = 'line' + strtrim(i,2)
arrayname = findgen(3,sz[1])
arrayname[0,*] = xx
arrayname[1,*] = yy
arrayname[2,*] = vertline
endfor
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,但有没有办法使用'line'+ strtrim(i,2)定义的字符串在每次迭代时创建并填充一个新数组?在这种情况下,我有40个名为line0 ... 39的数组.这里的困难部分是sz [1]变化,所以我不能简单地定义一个大数组来保存所有东西.
我在重写同事IDL代码为蟒蛇的过程和我想出一些差异,我很困惑.根据我发现的其他SO问题和邮件列表线程,如果你使用scipy.ndimage.interpolation.map_coordinates并指定order=1它应该进行双线性插值.当比较IDL代码(在GDL中运行)和python(map_coordinates)之间的结果时,我得到了不同的结果.然后我尝试使用mpl_toolkits.basemap.interp,我得到了与IDL代码相同的结果.下面是一个显示错误的简单示例.有人可以帮我弄清楚我做错了什么map_coordinates或order=1不是双线性的?
from scipy.ndimage.interpolation import map_coordinates
from mpl_toolkits.basemap import interp
import numpy
in_data = numpy.array([[ 25.89125824, 25.88840675],[ 25.90930748, 25.90640068]], dtype=numpy.float32)
map_coordinates(in_data, [[0.0],[0.125]], order=1, mode='nearest')
# map_coordinates results in "25.89090157"
interp(in_data, numpy.array([0,1]), numpy.array([0,1]), numpy.array([0.0]), numpy.array([0.125]), order=1)
# interp results in "25.89351439", same as GDL's "25.8935" when printed
Run Code Online (Sandbox Code Playgroud)
我很好用interp,但我很好奇为什么map_coordinates没有返回相同的结果.我注意到map_coordinates文档没有提到双线性,它实际上是双线性的吗?我错过了什么?
python interpolation scipy idl-programming-language matplotlib-basemap
我正在寻找最有效的IDL代码来替换IDL矩阵乘(#)运算符,用于特定的,对角线(非对角线或对角线)矩阵,具有3个不同的值:对角线上的单位; 统一加上对角线右边的三角形; 统一减去左边相同的delta.
IDL(已修复;不可协商;对不起); 快门式CCD成像系统上的图像模糊.
一个1024x1024的矩阵,"EMatrix",对角线上有一个整体; 对角线左边的(1-delta); (1 + delta)向右; delta = 0.044.
另一个1024x1024矩阵,Image
2014-09-16:请参阅下面的更新
更大的问题陈述(其中矩阵乘法似乎只是最慢的部分,优化整个例程不会受到影响):
第9.3.1.2节(PDF第47页;内部页面34)和同一目录中的其他文件(抱歉作为新手我只能发布两个链接)
现在(2014-09-26)比1024x1024矩阵的IDL#运算符快一个数量级.
天真的操作是O(n ^ 3)并执行大约十亿(2 ^ 30)双精度乘法和大约相同数量的加法; 维基百科进一步告诉我,斯特拉森的算法将其降低到O(n ^ 2.807),或者约为282M +,n = 1024.
对于一个简单的3x3案例进行细分,比如图像和EMatrix
image EMatrix
[ 0 1 2 ] [ 1 p p ]
[ 3 4 5 ] # [ m 1 p ]
[ 6 7 8 ] [ m m 1 ]
Run Code Online (Sandbox Code Playgroud)
其中p代表1 + delta(1.044),m代表1-delta(0.956).
由于m和p的重复,应该有一个简化:查看图像的中间列,三行的结果应该是
[1,4,7] . [1,p,p] …Run Code Online (Sandbox Code Playgroud) algorithm optimization idl-programming-language matrix-multiplication
我必须在python中读取二进制文件.这首先是由Fortran 90程序以这种方式编写的:
open(unit=10,file=filename,form='unformatted')
write(10)table%n1,table%n2
write(10)table%nH
write(10)table%T2
write(10)table%cool
write(10)table%heat
write(10)table%cool_com
write(10)table%heat_com
write(10)table%metal
write(10)table%cool_prime
write(10)table%heat_prime
write(10)table%cool_com_prime
write(10)table%heat_com_prime
write(10)table%metal_prime
write(10)table%mu
if (if_species_abundances) write(10)table%n_spec
close(10)
Run Code Online (Sandbox Code Playgroud)
我可以使用以下IDL代码轻松读取此二进制文件:
n1=161L
n2=101L
openr,1,file,/f77_unformatted
readu,1,n1,n2
print,n1,n2
spec=dblarr(n1,n2,6)
metal=dblarr(n1,n2)
cool=dblarr(n1,n2)
heat=dblarr(n1,n2)
metal_prime=dblarr(n1,n2)
cool_prime=dblarr(n1,n2)
heat_prime=dblarr(n1,n2)
mu =dblarr(n1,n2)
n =dblarr(n1)
T =dblarr(n2)
Teq =dblarr(n1)
readu,1,n
readu,1,T
readu,1,Teq
readu,1,cool
readu,1,heat
readu,1,metal
readu,1,cool_prime
readu,1,heat_prime
readu,1,metal_prime
readu,1,mu
readu,1,spec
print,spec
close,1
Run Code Online (Sandbox Code Playgroud)
我想要做的是用Python读取这个二进制文件.但是有一些问题.首先,这是我尝试阅读该文件:
import numpy
from numpy import *
import struct
file='name_of_my_file'
with open(file,mode='rb') as lines:
c=lines.read()
Run Code Online (Sandbox Code Playgroud)
我尝试阅读前两个变量:
dummy, n1, n2, dummy = struct.unpack('iiii',c[:16])
Run Code Online (Sandbox Code Playgroud)
但是你可以看到我必须添加到虚拟变量,因为不知何故,fortran程序在这些位置添加整数8.
现在问题是在尝试读取其他字节时.我没有得到相同的IDL程序结果.
这是我尝试读取数组n …
在之前的函数中,我创建并返回了一个哈希值。执行此操作后,它将哈希作为结构返回,我将其用作此以下函数的输入。
myStruct 的每个标签都是一个结构,每个都有一个名称和数据类型标签。
我正在尝试遍历每个标签以查找特定数据类型出现在哪个“名称”处。
pro plotter, myStruct
numtags = n_tags(myStruct)
names = tag_names(myStruct)
for varID = 0, numtags do begin
if ( strcmp( myStruct.(names[varID]).datatype, 'Temperature, Head 1')) then print, varID
endfor
end
Run Code Online (Sandbox Code Playgroud)
尝试运行后出现以下错误:“类型转换错误:无法将给定的 STRING 转换为 Long。”
是什么导致了这个错误?我可以使用变量名访问标签吗?