我正在将一些 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)
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)
你不能logrange
像这样定义自己的函数吗:
logrange(x1, x2, n) = (10^y for y in range(log10(x1), log10(x2), length=n))
Run Code Online (Sandbox Code Playgroud)
?
这会返回一个生成器,因此它不会分配数组,并且应该易于其他用户理解和使用。
小智 1
你可以只使用range
对于对数间隔值 \xe2\x88\x88 [1.0e-10, 1.0e10]:
\n10 .^ range(-10, stop=10, length=101)\n
Run Code Online (Sandbox Code Playgroud)\n