1

大家下午。我目前正在将 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 函数,如下所示:

def pylindgen(shape):
    nelem = numpy.prod(numpy.array(shape))
    out = numpy.arange(nelem,dtype=int)
    return numpy.reshape(out,shape)

...以及移植的代码,其中 k2arr 是一个形状数组(267,):

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

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

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

4

2 回答 2

0

pylindgen 的代码非常适合我。但是会产生一个 (267,267) 的数组。如果 k2array 是 (267,) 数组,您应该会收到如下错误:

ValueError:布尔索引数组应该有 1 维

那是你的问题吗?干杯

于 2013-07-23T19:10:43.633 回答
0

我对 IDL 的了解已经不如从前了,我得稍微研究一下。IDL 中的运算符“>”不等同于 python(或其他语言)。它稳定了一个最大值,任何高于它的值都将设置为该值。“<”也是如此,显然,它设置了一个最小值。

dk2 = (k2arr((ind2+1) < nsteps) - k2arr(ind2-1) > 0)) 其中 k2arr 是 266 而 ind2 是 (266,266) 相当于说:

 - (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. 

棘手的部分是现在。对 (ind2+1) 和 (ind2-1) 的每一行计算 k2arr (266,),这意味着如果 (ind2+1 < nsteps) = [1,2,3,...,nsteps-1 , nsteps, nsteps] k2arr 将被评估 266 次,一个在另一个之上,结果是 (266,266) 数组。

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

于 2013-07-23T20:48:46.933 回答