2017-10-30 50 views
2

Juliaでvecは、多次元配列を1次元配列に再構成します。 しかし、配列の配列やタプルの配列に対しては機能しません。 配列の理解を使用している部分は、配列/タプルの配列を平坦化する別の方法がありますか?または、配列/タプルの配列/タプルの配列?あなたはRecursiveArrayTools.jlからVectorOfArrayを使用している場合か...Julia:配列/タプルの配列を平滑化

答えて

5

Iterators.flatten(x)は、xの各要素を反復するジェネレータを作成します。それは安定したタイプの音ではありませんので、あなたが配列やタプルの配列の配列を持っている場合、それはあなたが記述例いくつか、例えば

julia> collect(Iterators.flatten([(1,2,3),[4,5],6])) 
6-element Array{Any,1}: 
1 
2 
3 
4 
5 
6 

を扱うことができ、あなたはおそらく、あなたのデータ構造を再検討すべきです。しかし、あなたは私の例のすべてがArray{Any,1}を返す方法例えば、flatten

julia> collect(Iterators.flatten([(1,2,[3,3,3,3]),[4,5],6])) 
6-element Array{Any,1}: 
1    
2    
    [3, 3, 3, 3] 
4    
5    
6    

julia> collect(Iterators.flatten(Iterators.flatten([(1,2,[3,3,3,3]),[4,5],6]))) 
9-element Array{Any,1}: 
1 
2 
3 
3 
3 
3 
4 
5 
6 

注意を複数の呼び出しを使用することができます。これは、コンパイラが出力配列の要素に対して単一の具体的な型を決定できなかったことを意味するため、パフォーマンスの悪い兆候です。これらの例を選んだのは、不安定なコンテナを既に入力しているように聞こえるように聞こえるからです。配列の配列を平坦化するために

+0

!私の場合、それは配列だけでタプルはないので、それは私の問題ではありません。しかし、 "Iterators"パッケージを追加し、 "Iteratorsを使用して"呼び出すと、(REPL内の)flattenを使用しようとすると、関数が存在しないことがわかります。私はJulia 0.6.1にあります。 – Pigna

+1

'Iterators'が組み込まれています。古い 'Iterators'パッケージは廃止されました。私はあなたが今それをインストールすれば何が起こるのか分からないが、何か問題があればそれをアンインストールする。エクスポートされたメソッド( 'flatten'を含む)を取得するためには' Base.Iterators'を使う必要があり、 'import Base.Iterators:flatten'はただ一つ取得する必要があります。 – gggg

4

、それはVectorOfArrayAためconvert(Array,A)を提供するために、インデックスのフォールバックを使用しています。

julia> using RecursiveArrayTools 

julia> A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
3-element Array{Array{Int64,1},1}: 
[1, 2, 3] 
[4, 5, 6] 
[7, 8, 9] 

julia> VA = VectorOfArray(A) 
3-element Array{Array{Int64,1},1}: 
[1, 2, 3] 
[4, 5, 6] 
[7, 8, 9] 

それの第一は、変換せずにインデックス付けを行うための怠惰なラッパーとして機能する:それはまだ「列優先」(すなわちへの効率的だということな方法ので列は別々の配列であることを

julia> VA[1,3] 
7 

注意インデックスダウン列)。しかし、それはストレートの変換があります。

julia> convert(Array,VA) 
3×3 Array{Int64,2}: 
1 4 7 
2 5 8 
3 6 9 

、この変換を処理するための他の方法はhcat(A...)ような何かをすることですが、あなたがスプラッティングしている配列の多くを持っている場合、それは遅いです!

ここで、あなたは考えるかもしれません:マトリックスをあらかじめ割り振ってからループしていっていっていって、それを埋める関数を書くのはどうですか? convertがここで使用するフォールバックを除いて、ほとんどがVectorOfArrayconvertが動作していますが、Tim Holyのデカルト機械を使用しています。

function vecvec_to_mat(vecvec) 
    mat = Matrix{eltype(eltype(vecvec))}(length(vecvec),length(vecvec[1])) 
    for i in 1:length(vecvec) 
    mat[i,:] .= vecvec[i] 
    end 
    mat 
end 

が、フォールバックがはるかに高速だったので、私は、以来、それを取り除く得ている:ある時点で、私はその関数を書きました。だから、YMMVがあなたの問題を解決するいくつかの方法です。

2

は、単にこのようなVCAT()を使用することができます。私が探していたまさにです

julia> A = [[1,2,3],[4,5], [6,7]] 
Vector{Int64}[3] 
    Int64[3] 
    Int64[2] 
    Int64[2] 
julia> flat = vcat(A...) 
Int64[7] 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
+0

配列の配列の配列に対して機能しないようです。 – Timmmm