在Julia(v1.3.1)中是否存在`logspace`的替代方法?

7

背景和现有解决方案

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

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

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

使用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.00131825673855640751000.0                  

但是我希望在我的当前项目中使用纯Julia实现这一过程。在Julia文档中找不到相同的函数后,经过一番搜索,我发现了一个旧版logspace的文档入口(在此)。然后我看到了这个Github拉取请求logspace弃用掉,并将其定义为该创建对数间隔序列的方法。
julia> X_julia  = 10 .^ range( -3, 3, length = 101 )
101-element Array{Float64,1}:
    0.001                
    0.0011481536214968829
    0.00131825673855640751000.0        

TL;DR / 实际问题
julia> LinRange(1e-3, 1e3, 101)
101-element LinRange{Float64}:
 0.001,10.001,20.001,…,1000.0

由于目前存在一个简单易读的函数LinRange,用于创建线性序列(如上所示),是否存在类似于LogRange的函数用于创建对数序列?
在这个项目中,我追求简单和易读性,因此虽然将range广播到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 )

1
答案可能是“不”。那个PR已经有很多讨论了,但我想你可以打开一个问题,请求将LogRange恢复。 - daycaster
@daycaster 是的,我正在尝试避免承担那项工作,因为有时我需要的东西实际上可能已经存在(仍然存在)。 - V-J
2个回答

5

你不可以定义自己的函数logrange来实现吗?像这样:

logrange(x1, x2, n) = (10^y for y in range(log10(x1), log10(x2), length=n))

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


1
原则上是的,并且符合我目前所做的工作目的。我只是想知道 LogSpace / LogRange 是否仍然存在于某个软件包中,这样我就不必为每个我正在处理或需要维护自己的文档定义该函数了。 - V-J
1
最好创建一个“LogRange”结构体来惰性计算元素,但这并不是最大的问题。 - Oscar Smith
3
这个解决方案确实是惰性计算的,而且比实现一个需要迭代的类型要简单得多。 - DNF
这个生成器不允许随机访问,也不能精确地到达末尾(例如 first(logrange(0.01, 1, 3)) != 0.01)。这些问题已在 https://github.com/JuliaLang/julia/pull/39071 中得到了修正。 - mcabbott

1

你可以直接使用range

对于在[1.0e-10, 1.0e10]范围内的对数间隔值:

10 .^ range(-10, stop=10, length=101)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接