web-dev-qa-db-ja.com

Julia配列のデータ型を「Any」から「Float64」に変更するにはどうすればよいですか?

Juliaに、希望するタイプの配列のコピーを返す関数、つまり numpys astype function に相当するものはありますか? 「Any」タイプの配列があり、それをFloat配列に変換したい。私は試した:

new_array = Float64(array)

しかし、私は次のエラーを受け取ります

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

配列を通過して各要素のfloat値を返す関数を作成するだけですが、これを行う組み込みのメソッドがない場合は少し奇妙です。

15
P4nd4b0b3r1n0

convertを使用します。最初の配列に使用した構文に注意してください。配列が作成される前に必要なものがわかっている場合は、角括弧の前に型を宣言できます。 AnyFloat64に置き換えるのと同じくらい簡単に、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
14
Randy Zwitch

以下を使用できます。

new_array = Array{Float64}(array)

7
Daniel Arndt

ブロードキャスト演算子.を使用することもできます。

a = Any[1.2, 3, 7]
Float64.(a)
2
Ian Fiske

ダニエルとランディの答えはしっかりしています。複雑な反復ケースを比較的簡潔にすることができるので、ここで私が好きな別の方法を追加します。そうは言っても、変換/型宣言に関連する他の回答ほど効率的ではありません。しかし、構文は他のユースケースにかなり簡単に拡張できるため、追加する価値があります。

a = Array{Any,1}(Rand(1000))
f = [float(a[i]) for i = 1:size(a,1)]
1
Jacob Amos