将IDL代码、lindgen函数移植到Python中

2024-09-27 00:15:15 发布

您现在位置:Python中文网/ 问答频道 /正文

大家下午好。我目前正在将一个IDL代码移植到python上,到目前为止,这一切都是一帆风顺的。我被IDL代码的这一部分困住了:

nsteps = 266    
ind2 = ((lindgen(nsteps+1,nsteps+1)) mod (nsteps+1))
dk2 = (k2arr((ind2+1) < nsteps) - k2arr(ind2-1) > 0)) / 2.

我的版本包括重写的lindgen函数,如下所示:

^{pr2}$

。。。还有一个移植代码,其中k2arr是一个shape数组(267,):

ind2 = pylindgen((nsteps+1,nsteps+1)) % (nsteps+1)
dk2 = (k2arr[ (ind2+1) < nsteps ] - k2arr[ (ind2-1) > 0. ]) / 2.

现在,问题是我的代码使ind2成为一个数组,通过查看IDL代码和python脚本中抛出的错误,我确信ind2应该是一个标量。我是否缺少这些IDL函数的某些特性?

任何想法都将不胜感激。 干杯。


Tags: 函数代码版本脚本mod数组idlshape
2条回答

我对IDL的了解已经不是以前的样子了,我不得不研究一下。IDL中的运算符“>;”不是python(或其他语言)的等价物。它建立了一个最大值,任何高于它的值都将被设置为该值。“<;”也一样,很明显,它设置了一个最小值。在

dk2=(k2arr((ind2+1)<;nsteps)-k2arr(ind2-1)>;0)) 其中k2arr为266,ind2为(266266266),相当于:

 - (ind2+1 < nsteps) take ind2+1 and, in any place that ind2+1 
   is greater than nsteps, replace by nsteps. 
 - (ind2-1 > 0) take ind2-1 and, in any place that ind2-1 is 
   less than zero, put zero instead. 

最棘手的是现在。k2arr(266,)是针对(ind2+1)和(ind2-1)的每一行计算的,这意味着如果(ind2+1<;nsteps)=[1,2,3,…,nsteps-1,nsteps,nsteps]则k2arr将被精确地计算266次,一个接一个,结果是(266266266)数组。在

现在我记得为什么我停止在IDL中编程了!在

pylindgen的代码对我来说很好用。但是生成一个数组(267267)。如果k2array是一个(267,)数组,那么应该会得到如下错误:

ValueError:布尔索引数组应具有一维

这就是你的问题? 干杯

相关问题 更多 >

    热门问题