下午大家。我目前正在将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功能的一些功能吗?
任何想法都将不胜感激。 欢呼声。
答案 0 :(得分:0)
pylindgen的代码非常适合我。但是,产生了一个(267,267)的数组。如果k2array是一个(267,)数组,你应该收到如下错误:
ValueError:布尔索引数组应该有1维
这是你的问题吗? 干杯
答案 1 :(得分:0)
我对IDL的了解不像过去那样,我不得不研究一下。运营商“&gt;”在IDL中不等同于python(或其他语言)。它会建立一个最大值,高于它的任何值都将设置为该值。同样适用于“&lt;”,显然,它设置了最小值。
dk2 =(k2arr((ind2 + 1)&lt; nsteps) - k2arr(ind2-1)&gt; 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&lt; nsteps)= [1,2,3,...,nsteps- 1,nsteps,nsteps] k2arr将被精确地评估266次,一个在另一个之上,结果是(266,266)数组。
现在我记得为什么我不再使用IDL进行编程了!