Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中从IDL定义函数_Python_Function_For Loop_Idl Programming Language - Fatal编程技术网

在Python中从IDL定义函数

在Python中从IDL定义函数,python,function,for-loop,idl-programming-language,Python,Function,For Loop,Idl Programming Language,我试图将IDL中的大量代码复制到Python中。我认为我遇到的一个问题是gridgen函数的定义。Gridgen是一个用于生成具有相等对数间距网格点的垂直网格的函数,其中:zmin=网格顶部的坐标;zmax=网格底部的坐标;Nlvls=网格中所需的级别数,z=输出网格 IDL代码为: FUNCTION GRIDGEN, zmin, zmax, Nlvls dlnz = (ALOG(zmax)-ALOG(zmin))/(Nlvls-1) ;divisions in log spac

我试图将IDL中的大量代码复制到Python中。我认为我遇到的一个问题是gridgen函数的定义。Gridgen是一个用于生成具有相等对数间距网格点的垂直网格的函数,其中:zmin=网格顶部的坐标;zmax=网格底部的坐标;Nlvls=网格中所需的级别数,z=输出网格

IDL代码为:

FUNCTION GRIDGEN, zmin, zmax, Nlvls
  dlnz       = (ALOG(zmax)-ALOG(zmin))/(Nlvls-1) ;divisions in log space
  z          = FLTARR(Nlvls) ;array of Nlvls points for logarithm to base 10
  z[*]       = 0.            ;initialize grid to zero
  z[Nlvls-1] = ALOG(zmax)    ;assign the maximum value in log spacing
  FOR i=Nlvls-2, 0, -1 DO z[i] = z[i+1] - dlnz ;generate log spacing values
  z          = EXP(z) ;convert from log(z) to actual values
  RETURN, z
END
我是如何将其转换为Python的:

def gridgen100(zmin, zmax, Nlvls):
    dlnz = ((np.log(zmax) - np.log(zmin))/(Nlvls - 1))  # divisions in log space
    z = np.zeros(Nlvls, dtype=float)                    # array of Nlvls points for logarithm to base 10
    z[Nlvls-1] = np.log(zmax)                           # assign the maximum value in log spacing
    for i in np.arange(Nlvls-2, Nlvls-101, -1):         # NOT CORRECT; correct is: for i in [Nlvls-2, 0, -1]:
      z[i] = z[i +1] - dlnz                             # generate log spacing values
      #z = np.exp(np.array(z))                          # convert from log(z) to actual values [MUST DO OUTSIDE DEF]
return z
这些问题是:

  • 因为我是如何使用np.arange创建for循环的,所以当我有不同的NLVL时,我必须定义一个单独的gridgen函数(例如,有时我有100个NLVL,有时我有25个NLVL)
  • 我不能在函数中从log(z)转换为实际值,我必须在定义之外进行转换 我目前没有访问IDL的权限,因此无法通过比较IDL输出和Python输出来进行故障排除


    我自学Python,是一名初学者,但我感谢任何人提供的任何帮助或建议

    IIUC,您的IDL for循环转换为

    for i in range(Nlvls-2, -1, -1):
    
    i、 e.从Nlvls-2开始,下降1直到达到0。这给了我

    def gridgen(zmin, zmax, Nlvls):
        dlnz = (np.log(zmax) - np.log(zmin))/(Nlvls-1)
        z = np.zeros(Nlvls, dtype=float)
        z[Nlvls-1] = np.log(zmax)
        for i in range(Nlvls-2, -1, -1):
            z[i] = z[i+1] - dlnz
        z = np.exp(z)
        return z
    

    但是已经有了一个numpy函数,它可以为您计算日志间距,所以如果我对您所追求的是正确的,您可以使用它来获得相同的结果:

    >>> np.logspace(np.log10(2), np.log10(8), 10)
    array([ 2.        ,  2.33305808,  2.72158   ,  3.1748021 ,  3.70349885,
            4.32023896,  5.0396842 ,  5.87893797,  6.85795186,  8.        ])
    

    (对于第2点,如果您不想返回原始空间,显然可以删除
    z=np.exp(z)
    行。)

    非常感谢!我得到的输出与我使用稍微不正确的代码得到的输出相同,但增加了在定义中包含exp的功能。但我也很高兴能把它装在一个更好的包里,并验证它的正确性。再次感谢你!
    >>> np.logspace(np.log10(2), np.log10(8), 10)
    array([ 2.        ,  2.33305808,  2.72158   ,  3.1748021 ,  3.70349885,
            4.32023896,  5.0396842 ,  5.87893797,  6.85795186,  8.        ])