This seems trivial but I haven't found a way to do it. I have range of floating numbers
julia> ts
10000.0:1.0:20000.0
and I would like to convert it to a range of integers to use it to index an array, ie I would like to get 10000:1:20000
. The closest I come is with
floor.(Int, ts)
but this returns an array not a range. The array works fine for indexing but I wonder if there is a more julian way of doing this.
julia> ts = 1e5:1.0:2e5
100000.0:1.0:200000.0
julia> dump(ts)
StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}
ref: Base.TwicePrecision{Float64}
hi: Float64 100000.0
lo: Float64 0.0
step: Base.TwicePrecision{Float64}
hi: Float64 1.0
lo: Float64 0.0
len: Int64 100001
offset: Int64 1
julia> range(Int(ts.ref.hi), step=Int(ts.step.hi), length=ts.len)
100000:1:200000
:star_struck: I had no idea that a range was a struct with fields you can access. Thank you :smile:
Andreas has marked this topic as resolved.
the fields are not API, so it's better to write this as
julia> ts = 1e5:1.0:2e5
100000.0:1.0:200000.0
julia> Int(first(ts)):Int(step(ts)):Int(last(ts))
100000:1:200000
Makes sense. I should have thought of that
crucially, that'll also work with other kinds of ranges, like this one:
julia> ts = 10^5:2*10^5
100000:200000
julia> ts.step
ERROR: type UnitRange has no field step
Stacktrace:
[1] getproperty(x::UnitRange{Int64}, f::Symbol)
@ Base ./Base.jl:37
[2] top-level scope
@ REPL[5]:1
julia> Int(first(ts)):Int(step(ts)):Int(last(ts))
100000:1:200000
Great, thank you :smile:
Last updated: Dec 28 2024 at 04:38 UTC