Julia (v1.3.1) 中是否存在任何“logspace”替代方案?

V-J*_*V-J 5 python julia

背景和现有解决方案

我正在将一些 Python 代码移植到 Julia (v1.3.1) 中,并且在尝试将代码重现为 Julia 中易于阅读的代码时遇到了问题。

在 Python 中(使用numpy),我们创建了一个从 0.001 到 1000 的 101 个元素的对数间隔序列:

>>> X = numpy.logspace( -3, 3, 101 )
array([1.00000000e-03, 1.14815362e-03, 1.31825674e-03, ..., 1.00000000e+03])
Run Code Online (Sandbox Code Playgroud)

在 Julia 中实现它PyCall当然会像这样工作:

julia> using PyCall
julia> numpy = pyimport("numpy")
julia> X_python = numpy.logspace( -3, 3, 101 )
101-element Array{Float64,1}:
    0.001                
    0.0011481536214968829
    0.0013182567385564075 
    ?       
 1000.0                  
Run Code Online (Sandbox Code Playgroud)

但是我想在我当前的项目中用纯 Julia 实现这个。在 Julia 文档中没有找到相同的功能,经过一番搜索后,我发现了一个较旧的文档条目logspace here。然后我遇到了这个 Github pull request 要求弃用logspace它的定义,所以目前看来这是创建对数间隔序列的方法:

julia> X_julia  = 10 .^ range( -3, 3, length = 101 )
101-element Array{Float64,1}:
    0.001                
    0.0011481536214968829
    0.0013182567385564075
    ?                    
 1000.0        
Run Code Online (Sandbox Code Playgroud)

TL;DR / 实际问题

julia> LinRange(1e-3, 1e3, 101)
101-element LinRange{Float64}:
 0.001,10.001,20.001,…,1000.0
Run Code Online (Sandbox Code Playgroud)

由于目前存在一个简单易读的函数 ,LinRange用于创建线性序列(如上所示),是否存在类似的函数,例如LogRange,用于对数序列?

我在这个项目中追求简单性和提高可读性,所以range从数学的角度将a 广播到 10 个作品的指数,LogRange(1e-3, 1e3, 101)对于初学者或兼职程序员来说,类似的东西更容易理解。


编辑:当序列的限制是 10 的整数指数时,代码相当清晰,但是当限制是浮点数时,LogRange()和之间的可读性差异10 .^ ()变得更加明显:

julia> 10 .^ range( log10(1.56e-2), log10(3.62e4), length = 101 )
julia> LogRange( 1.56e-2, 3.62e4, 101 )
Run Code Online (Sandbox Code Playgroud)

DNF*_*DNF 5

你不能logrange像这样定义自己的函数吗:

logrange(x1, x2, n) = (10^y for y in range(log10(x1), log10(x2), length=n))
Run Code Online (Sandbox Code Playgroud)

这会返回一个生成器,因此它不会分配数组,并且应该易于其他用户理解和使用。

  • 但这个解决方案*确实*会延迟计算,并且它比通过迭代实现类型要简单得多。 (3认同)

小智 1

你可以只使用range

\n

对于对数间隔值 \xe2\x88\x88 [1.0e-10, 1.0e10]:

\n
10 .^ range(-10, stop=10, length=101)\n
Run Code Online (Sandbox Code Playgroud)\n