Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I change the data type of a Julia array from "Any" to "Float64"?

Tags:

arrays

julia

Is there a function in Julia that returns a copy of an array in a desired type, i.e., an equivalent of numpys astype function? I have an "Any" type array, and want to convert it to a Float array. I tried:

new_array = Float64(array)

but I get the following error

LoadError: MethodError: `convert` has no method matching 
convert(::Type{Float64}, ::Array{Any,2})
This may have arisen from a call to the constructor Float64(...),
since type constructors fall back to convert methods.
Closest candidates are:
  call{T}(::Type{T}, ::Any)
  convert(::Type{Float64}, !Matched::Int8)
  convert(::Type{Float64}, !Matched::Int16)
  ...
  while loading In[140], in expression starting on line 1

  in call at essentials.jl:56

I can just write a function that goes through the array and returns a float value of each element, but I find it a little odd if there's no built-in method to do this.

like image 978
P4nd4b0b3r1n0 Avatar asked Feb 18 '16 13:02

P4nd4b0b3r1n0


4 Answers

Use convert. Note the syntax I used for the first array; if you know what you want before the array is created, you can declare the type in front of the square brackets. Any just as easily could've been replaced with Float64 and eliminated the need for the convert function.

julia> a = Any[1.2, 3, 7]
3-element Array{Any,1}:
 1.2
 3  
 7  

julia> convert(Array{Float64,1}, a)
3-element Array{Float64,1}:
 1.2
 3.0
 7.0
like image 138
Randy Zwitch Avatar answered Oct 20 '22 11:10

Randy Zwitch


You can also use the broadcast operator .:

a = Any[1.2, 3, 7]
Float64.(a)
like image 26
Ian Fiske Avatar answered Oct 20 '22 09:10

Ian Fiske


You can use:

new_array = Array{Float64}(array)

like image 12
Daniel Arndt Avatar answered Oct 20 '22 10:10

Daniel Arndt


Daniel and Randy's answers are solid, I'll just add another way here I like because it can make more complicated iterative cases relatively succinct. That being said, it's not as efficient as the other answers, which are more specifically related to conversion / type declaration. But since the syntax can be pretty easily extended to other use case it's worth adding:

a = Array{Any,1}(rand(1000))
f = [float(a[i]) for i = 1:size(a,1)]
like image 2
Jacob Amos Avatar answered Oct 20 '22 11:10

Jacob Amos