2016-12-19 25 views
3

3Dテンソルの最後の次元のインデックスを使用して4Dテンソルの最後の次元をインデックスする必要があります。3Dテンソルの最後の次元のインデックスを使用して4Dテンソルの最後の次元をインデックスする

R = array([[[ 0.33678107, 0.05052149], 
    [ 0.73191095, 0.9863605 ]], 

    [[ 0.62897664, 0.78402321], 
    [ 0.99032742, 0.05827109]]]) 

どのようにすることができます:以下のテンソルを取得

Y = array([[[5, 3], 
    [9, 0]], 

    [[6, 5], 
    [5, 7]]]) 

X = array([[[[ 0.14127222, 0.37404611, 0.09612721, 0.19907043, 0.84104371, 
     0.33678107, 0.03965124, 0.16844736, 0.61240914, 0.02107638], 
    [ 0.46010377, 0.4302605 , 0.95917015, 0.05052149, 0.96033522, 
     0.6383985 , 0.24895258, 0.78746404, 0.42848993, 0.16791814]], 

    [[ 0.04889435, 0.82308922, 0.96655923, 0.48346 , 0.95437383, 
     0.87187596, 0.68328151, 0.70910435, 0.14809697, 0.73191095], 
    [ 0.9863605 , 0.93424879, 0.8210592 , 0.60322001, 0.09030777, 
     0.43904245, 0.90761251, 0.97734195, 0.83937746, 0.4611313 ]]], 


    [[[ 0.63942727, 0.39519546, 0.96378125, 0.67925937, 0.43680618, 
     0.51125503, 0.62897664, 0.38485839, 0.62766846, 0.20661218], 
    [ 0.34816242, 0.0278764 , 0.90386847, 0.82995975, 0.37891653, 
     0.78402321, 0.15557263, 0.23951166, 0.69553685, 0.65161346]], 

    [[ 0.82596645, 0.81959286, 0.39348156, 0.23748691, 0.4410078 , 
     0.99032742, 0.56643199, 0.00693051, 0.96698697, 0.19360464], 
    [ 0.06039541, 0.97289256, 0.81413577, 0.15651002, 0.52284394, 
     0.76748494, 0.47697888, 0.05827109, 0.54494079, 0.95826538]]]]) 

は、私は、次のインデックスのテンソルを使用して、それから値を抽出する:たとえば、以下のテンソルを与えられました私はTensorFlowでそれをしますか?私はreduce_sumとtf.one_hotの組み合わせでそれを解決しましたが、1つのホットベクトルの巨大テンソルを表現する必要があるメモリ集約型操作です。

ありがとうございます。

+0

私はnumpyの回答を追加しましたが、私は今あなたがテンソルフローで独占的に働いているように感じました。テンソルフローに対してテストすることができないため、私の答えがあなたのユースケースに当てはまらないかどうか教えてください。 –

答えて

0

あなたがリスト/配列ではなく、スライスを持つXの最初の次元にインデックスを付けるすなわち、あなたのnumpyのアレイのfancy indexingを必要とする:マジックナンバーにそれは少しにくいようにするには

>>> import numpy as np 
>>> i,j,k = np.ogrid[:2,:2,:2] 
>>> X[i,j,k,Y] 
array([[[ 0.33678107, 0.05052149], 
     [ 0.73191095, 0.9863605 ]], 

     [[ 0.62897664, 0.78402321], 
     [ 0.99032742, 0.05827109]]]) 

、およびを利用しますタプルアンパック:

>>> ijk = np.ogrid[[slice(None,k) for k in Y.shape]] 
>>> X[(*ijk),Y] 
array([[[ 0.33678107, 0.05052149], 
     [ 0.73191095, 0.9863605 ]], 

     [[ 0.62897664, 0.78402321], 
     [ 0.99032742, 0.05827109]]]) 

索引付けXに配列を通過させることにより、numpyのは、このようなの[n1,n2,n3,n4]要素、4つの(2,2,2,2)字形アレイを解釈しますそれぞれが一緒に使用されてXから対応する要素を取得し、結果はこれらのインデックス配列の形状を保持します。

+1

あなたの答えはnumpy関数を使用しますが、OPはテンソルフローテンソルを操作するように求めました。 – sygi

+0

@sygiええ、ありがとう、[投稿後にそれを実現](http://stackoverflow.com/questions/41227622/indexing-last-dimension-of-4d-tensor-using-indexes-in-last-dimension-of -3d-tenso/41227669#comment69656145_41227622)。私はテンソル流のテンソルは、主に*ボンネットの下では数が少ない配列であるかもしれないという印象の下にあった。私は、答えがまだ働くことを望んで、OPのコメントを残しました。それがわからない場合は、私は喜んで答えを削除します(私はちょっとフィードバックの前にそれをしたいと思っていませんでした。*助けてください) –

+0

@sygi実際には、私は最後にテンソルフロー実際のテンソル流のテンソルは、OPの質問の対象として印刷されていないようです。これらの量は、おそらく 'tf.Session()。run'から来たような気がしない配列のように見えます。この場合、上記の解決策は完全に機能します。 –

関連する問題