【问题标题】:Porting IDL code, lindgen function to Python将 IDL 代码、lindgen 函数移植到 Python
【发布时间】:2013-11-08 03:46:54
【问题描述】:

大家下午。我目前正在将 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 函数的某些功能?

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

【问题讨论】:

  • 根据 pylindgen() 中的定义,ind2 是一个 numpy 数组,所以我觉得不需要再定义一个了。
  • 请发布您看到的 Python 错误。在 IDL 代码中,ind2 是一个数组,其中已按元素应用了 mod 操作。您为执行相同操作而提供的 Python 代码对于将 mod 应用于 NumPy ndarray 是正确的。错误必须来自代码的不同部分。
  • 请参阅下面的 Jblasco 了解错误。感谢您的回复!

标签: python arrays numpy idl-programming-language


【解决方案1】:

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

dk2 = (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

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

【讨论】:

  • 哦,见鬼。操作员是我唯一没有抬头的东西,因为它在我心中根深蒂固,意味着 LT/GT。我明天会实施这个,让你知道结果。非常感谢!
【解决方案2】:

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

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

这是你的问题吗? 干杯

【讨论】:

  • 由此看来,您似乎正在尝试使用二维(或更多)索引块 ind2 索引一维对象 k2arr。您必须确保您的索引集与您要索引的数组具有适当的形状。
  • 我明白了。由于我对 IDL 的了解有限,看起来 IDL 代码正在这样做!显然,这不可能是真的。我将研究这条调查线。谢谢@EMS。非常感谢。
猜你喜欢
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多