2016-02-18 12 views
8

Esiste una funzione in Julia che restituisce una copia di un array in un tipo desiderato, ad esempio un equivalente di numpys astype function? Ho una matrice di tipo "Qualsiasi" e voglio convertirla in un array Float. Ho provato:Come si modifica il tipo di dati di un array Julia da "Qualsiasi" a "Float64"?

new_array = Float64(array) 

ma ottengo il seguente errore

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 

posso solo scrivere una funzione che passa attraverso l'array e restituisce un valore float di ogni elemento, ma io lo trovo un po 'strano se non esiste un metodo integrato per farlo.

risposta

7

È possibile utilizzare:

new_array = Array{Float64}(array)

11

Usa convert. Nota la sintassi che ho usato per il primo array; se sai cosa vuoi prima che venga creato l'array, puoi dichiarare il tipo davanti alle parentesi quadre. Any altrettanto facilmente avrebbe potuto essere sostituito con Float64 ed eliminata la necessità della funzione convert.

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 
1

risposte Daniel e Randy sono solidi, mi limiterò a aggiungere un altro modo in cui qui Mi piace perché può rendere i casi più complicati iterativi relativamente succinta. Detto questo, non è efficiente come le altre risposte, che sono più specificamente correlate alla dichiarazione di conversione/tipo. Ma dal momento che la sintassi può essere abbastanza facilmente estesa ad altri casi d'uso vale la pena di aggiungere:

a = Array{Any,1}(rand(1000)) 
f = [float(a[i]) for i = 1:size(a,1)] 
+1

Ho usato questo metodo per la conversione di voci di stringa lette da CSV direttamente per ottenere i valori 't4new = [parse (t4 [i]) per i = 1: length (t4)] '. questo mi dà la gamma di valori int di cui avevo bisogno, come previsto, il tuo uso è estensibile. – Vass

1

È anche possibile utilizzare l'operatore di trasmissione .:

a = Any[1.2, 3, 7] 
Float64.(a) 
Problemi correlati