2015-11-16 13 views
5

ジュリアでは、numpyの高度なインデックス作成に似た、多次元配列から複数の要素を含むベクトルを取得する方法がありますか?例えば、この2次元配列から:ジュリアアレイから複数選択

genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3) 
genconv[[1,2,3],[2,3,1]] 

これは、3×3アレイではなく、ベクトルをもたらす: screen shot

+0

いいね? '[genconv [[1,2,3]、[2,3,1]] ...]' –

+0

いいえ、私は3つの要素を持つベクトルが必要です。 –

答えて

5

一方向にsub2ind関数を使用することであるcolrowインデックスで要素を取得する:

getindex(genconv,sub2ind(size(genconv),[1,2,3],[2,3,1]))

EDIT

は既にuser3580870 @

getindex(genconv,sub2ind(size(genconv),[1,2,3],[2,3,1]))は、私がgetindex配列内包構文間の効率に差を示さない得たものgenconv[sub2ind(size(genconv),[1,2,3],[2,3,1])]

に等しいコメントしています。

+2

a.k.a. 'genconv [sub2ind(size(genconv)、[1,2,3]、[2,3,1])] ' –

+0

クール、作品! Python/Rから来て、これは予期せず複雑に見えます。良いパフォーマンスが必要な場合はこれが良い選択ですか? –

+3

zip([1,2,3]、[2,3,1])] '(i、j)の' [genconv [i、j]これはもう少し直接的なようです。 – jverzani

2

別のオプションは、ちょうどむしろ多次元配列よりも、ベクトルとしてデータを扱うことです:

genconv = [6,9,7,1,4,2,3,2,0,9,10,8,7,8,5] 

genconv[ [10, 13] ] 
4

ジュリア0.5は今CartesianIndex ESのアレイによって索引付けをサポートしています。

julia> genconv[[CartesianIndex(1,2),CartesianIndex(2,3),CartesianIndex(3,1)]] 
3-element Array{Int64,1}: 
2 
8 
7 

かなり冗長だと:

julia> genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3) 
5×3 Array{Int64,2}: 
6 2 10 
9 3 8 
7 2 7 
1 0 8 
4 9 5 

julia> genconv[CartesianIndex(2,3)] # == genconv[2,3] 
8 

面白いのは、あなたがこのnumpyのスタイルの点別のインデックスを指定するCartesianIndex ESのベクトルを使用することができるということです。CartesianIndexは、複数の次元にまたがる特殊なインデックス・タイプでありますひどい見た目ですが、これは非常に素晴らしいソリューションのための新しいf.()特別な放送構文と組み合わせることができます:

julia> genconv[CartesianIndex.([1,2,3],[2,3,1])] 
3-element Array{Int64,1}: 
2 
8 
7