Convert float 2-D array to integer 2-D array in Julia
10,999
Solution 1
This answer is for Julia v0.3. For newer versions, see answer of DSM
Use the int function:
julia> a = rand(2,2)
2x2 Array{Float64,2}:
0.145651 0.362497
0.879268 0.753001
julia> int(a)
2x2 Array{Int64,2}:
0 0
1 1
Solution 2
You can convert a 2x2 array of floats into a 2x2 array of ints very easily, after you decide how you want rounding to be handled:
julia> A = [1.0 -0.3; 3.9 4.5]
2x2 Array{Float64,2}:
1.0 -0.3
3.9 4.5
julia> round.(Int, A)
2x2 Array{Int64,2}:
1 0
4 4
julia> floor.(Int, A)
2x2 Array{Int64,2}:
1 -1
3 4
julia> trunc.(Int, A)
2x2 Array{Int64,2}:
1 0
3 4
julia> ceil.(Int, A)
2x2 Array{Int64,2}:
1 0
4 5
Solution 3
You can use map, which preserves the matrix dimensions, and does not depend on vectorized methods:
julia> x = rand(2,2)
2x2 Array{Float64,2}:
0.279777 0.610333
0.277234 0.947914
julia> map(y->round(Int,y), x)
2x2 Array{Int64,2}:
0 1
0 1
Author by
I Like to Code
Updated on July 24, 2022Comments
-
I Like to Code 5 monthsI know that it is possible to convert a
Float64into anInt64using theconvertfunction. Unfortunately, it doesn't work when applyingconvertto a 2-D array.julia> convert(Int64, 2.0) 2 julia> A = [1.0 2.0; 3.0 4.0] 2x2 Array{Float64,2}: 1.0 2.0 3.0 4.0 julia> convert(Int64, A) ERROR: `convert` has no method matching convert(::Type{Int64}, ::Array{Float64,2 }) in convert at base.jl:13How do I convert a 2-D array of floats into a 2-D array of ints?
What I tried
I could do it using the following code, which is a little verbose but it works. I am hoping there is an easier way to do it though.
julia> A = [1.0 2.0; 3.0 4.0] 2x2 Array{Float64,2}: 1.0 2.0 3.0 4.0 julia> B = Array(Int64, 2, 2) 2x2 Array{Int64,2}: 4596199964293150115 4592706631984861405 4604419156384151675 0 julia> for i = 1:2 for j = 1:2 B[i,j] = convert(Int64,A[i,j]) end end julia> B 2x2 Array{Int64,2}: 1 2 3 4An answer that doesn't work for me
_ _ _ _(_)_ | A fresh approach to technical computing (_) | (_) (_) | Documentation: http://docs.julialang.org _ _ _| |_ __ _ | Type "help()" for help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 0.3.10 (2015-06-24 13:54 UTC) _/ |\__'_|_|_|\__'_| | Official http://julialang.org release |__/ | x86_64-linux-gnu julia> A = [1.2 3.4; 5.6 7.8] 2x2 Array{Float64,2}: 1.2 3.4 5.6 7.8 julia> round(Int64, A) ERROR: `round` has no method matching round(::Type{Int64}, ::Array{Float64,2}) -
I Like to Code over 7 yearsDo you know why I get the outputjulia> round([1.2 3.4], Int64) ERROR: 'round' has no method matching round(::Array{Float64,2}, ::Type{Int64}) -
DSM over 7 years@ILiketoCode: you're doing it the wrong way around. -
I Like to Code over 7 yearsSee my edited question where I try it the right way round and it still doesn't work... -
DSM over 7 years@ILiketoCode: I'm not sure what's going on, then -- I just tried it again with a fresh build, Version 0.4.0-dev+6177 (2015-07-22 19:39 UTC), and it worked just fine, and gave me2x2 Array{Int64,2}: 1 3 6 8on your example. -
mbauman over 7 yearsIt's new functionality in 0.4. On 0.3 you can doconvert(Array{Int}, round(A)). -
I Like to Code over 7 yearsIs there a stable release for 0.4? It seems the latest release is 0.3.10 -
I Like to Code over 7 yearsI'm accepting this answer because it is the easiest to type. -
mbauman over 7 yearsThat's correct. This will be the preferred syntax once 0.4 is released (soon). Until then, I'd recommend using the Compat.jl package, which enables the use of these new methods simply byusing Compat. -
mbauman over 7 yearsThis is deprecated on the soon-to-be-released 0.4 in favor of the methods in @DSM's answer, which explicitly state how to convert toInt. -
Andrew McKinlay about 6 yearsNote that these functions can still throw an
InexactError(). For example,round(Int64, convert(Float64, typemax(Int64))). -
keiv.fly over 5 yearsOn Julia 0.5: ERROR: UndefVarError: int not defined -
Hansang almost 3 yearsThis should not be the accepted answer anymore since it clearly doesn't work -
Hansang almost 3 yearsI've tested this implementation and the broadbasting methods in DSM's answer using btime, and in runtime they are similar in performance a = rand(10000,10000) (at)btime map(y->round(Int,y), a) # 501.133 ms vs (at)btime round.(Int, a) #489.392 ms