Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用三维张量最后一维中的索引索引4D张量最后一维_Python_Arrays_Multidimensional Array_Tensorflow - Fatal编程技术网

Python 使用三维张量最后一维中的索引索引4D张量最后一维

Python 使用三维张量最后一维中的索引索引4D张量最后一维,python,arrays,multidimensional-array,tensorflow,Python,Arrays,Multidimensional Array,Tensorflow,我需要使用三维张量最后一维中的索引来索引4D张量的最后一维。例如,给定以下张量: 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,

我需要使用三维张量最后一维中的索引来索引4D张量的最后一维。例如,给定以下张量:

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]]]])
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]]]])
R = array([[[ 0.33678107,  0.05052149],
    [ 0.73191095,  0.9863605 ]],

   [[ 0.62897664,  0.78402321],
    [ 0.99032742,  0.05827109]]])
如何在TensorFlow中执行此操作?我用reduce_sum和tf.one_hot的组合解决了这个问题,但这是一个内存密集型操作,需要表示一个热向量的巨大张量

谢谢。

您需要numpy数组,即使用列表/数组而不是切片索引到
X
的第一个维度:

>>> 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将解释四个
(2,2,2,2)
形状的数组,以便将每个
[n1,n2,n3,n4]
元素一起使用,以从
X
中获得相应的元素,并且结果保留这些索引数组的形状。

我添加了numpy的答案,但我现在才意识到,你似乎只和tensorflow一起工作,我不熟悉tensorflow。如果我的答案不适用于您的用例,请告诉我,因为我无法对tensorflow进行测试。您的答案使用numpy函数,但OP要求对tensorflow张量进行操作。@sygi是的,谢谢。我的印象是tensorflow张量可能主要是引擎盖下的numpy数组;我把这个评论留给OP,希望答案仍然有效。如果你知道答案是否定的,我很乐意删除答案(我只是不想在收到反馈之前这样做,以防万一有帮助)@sygi事实上,我意识到我上周安装了tensorflow,在我看来,实际的tensorflow张量并没有作为OP问题中的对象打印出来。这些数量看起来确实像numpy数组,可能来自
tf.Session().run
。如果是这样的话,上面的解决方案工作得很好。对我来说,很明显,OP需要TF而不是NUMPY解决方案(在这种情况下,解决方案不起作用),但也许让我们把它留给OP。@ Sigi-Ah,我明白你的意思,我没有考虑这种可能性。我们将看到OP的回应,感谢您的反馈:)