在Python中从IDL定义函数
我试图将IDL中的大量代码复制到Python中。我认为我遇到的一个问题是gridgen函数的定义。Gridgen是一个用于生成具有相等对数间距网格点的垂直网格的函数,其中:zmin=网格顶部的坐标;zmax=网格底部的坐标;Nlvls=网格中所需的级别数,z=输出网格 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
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
这些问题是:
我自学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. ])