2017-01-19 8 views
1

と仮定私は配列があります。ジュリアに古い配列の一部の行を繰り返して、新しい配列を作成します

julia> a = [1 1; 2 2; 3 3; 4 4; 5 5; 6 6; 7 7;] 
7×2 Array{Int64,2}: 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 

をそして私は、各行が新しい配列に繰り返します回数を指定ベクトルを作る:

julia> r = [0; 2; 0; 4; 0; 1; 0;] 
7-element Array{Int64,1}: 
0 
2 
0 
4 
0 
1 
0 

私が欲しいの出力は次のようになります。

julia> a_repeated = [2 2; 2 2; 4 4; 4 4; 4 4; 4 4; 6 6;] 
7×2 Array{Int64,2}: 
2 2 
2 2 
4 4 
4 4 
4 4 
4 4 
6 6 

私はそこに着く方法は?私はrepeat機能を使用すると思ったが、innerouterの仕組みを理解できていないようだ。

+0

X-REF:https://github.com/JuliaLang/julia/issues/16443 – Gnimuc

答えて

2

rep function from DataArrays.jlを使用して、これは、シンプルかつ効率的です。これは、しかし、そこに廃止予定ですので、私はそれを引き出し、それを自分で定義したい:

function rep{T <: Integer}(x::AbstractVector, lengths::AbstractVector{T}) 
    if length(x) != length(lengths) 
     throw(DimensionMismatch("vector lengths must match")) 
    end 
    res = similar(x, sum(lengths)) 
    i = 1 
    for idx in 1:length(x) 
     tmp = x[idx] 
     for kdx in 1:lengths[idx] 
      res[i] = tmp 
      i += 1 
     end 
    end 
    return res 
end 

sampleのように、それはベクトルではなく行列に動作しますので、我々はSample rows from an array in Juliaと同じ歌と踊りを行います。行のインデックスを計算して、行列へのインデックスにそれらを使用します。

julia> idxs = rep(indices(a, 1), r) 
7-element Array{Int64,1}: 
2 
2 
4 
4 
4 
4 
6 

julia> a[idxs, :] 
7×2 Array{Int64,2}: 
2 2 
2 2 
4 4 
4 4 
4 4 
4 4 
6 6 
+0

ありがとうございます。この答えは、大きな配列の場合よりもずっと速いので、私はこれを選択しました。 –

2

我々は結果を得るためにrepeatと配列内包を使用することができます。

julia> a[2,:]' 
1×2 Array{Int64,2}: 
2 2 

# inner=(2,1) 
# 2: repeat twice in the first dimension 
# 1: don't repeat in the second dimension 
julia> repeat(a[2,:]', inner=(2,1)) 
2×2 Array{Int64,2}:   
2 2 
2 2 

# returns empty array 
julia> repeat(a[2,:]', inner=(0,1)) 
0×2 Array{Int64,2} 

julia> vcat([repeat(a[i,:]', inner=(r[i],1)) for i in indices(a,1)]...) 
7×2 Array{Int64,2}: 
2 2 
2 2 
4 4 
4 4 
4 4 
4 4 
6 6 
+0

おかげで、私が行う方法を見て感謝しますこれは1行で表示されます。他の答えは私のマシン上で速かったので、私はそれを選んだ。 –

関連する問題