python - 使用 3D 张量的最后一个维度中的索引索引 4D 张量的最后一个维度

标签 python arrays multidimensional-array tensorflow

我需要使用 3D 张量的最后一个维度中的索引来索引 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]]]])

我想使用以下索引张量从中提取值:

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

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

获取如下张量:

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

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

我如何在 TensorFlow 中做到这一点?我结合使用 reduce_sum 和 tf.one_hot 解决了这个问题,但这是一个内存密集型操作,需要表示一个热向量的巨大张量。

谢谢。

最佳答案

你需要fancy indexing你的 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]]])

为了让它不那么容易出现魔数(Magic Number),并利用元组解包:

>>> 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中获取对应的元素,结果保留这些索引数组的形状。

关于python - 使用 3D 张量的最后一个维度中的索引索引 4D 张量的最后一个维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41227622/

相关文章:

python - 如何从 Odoo 10 中的自定义模块修改 noupdate ="1"XML 记录?

python - 有没有办法禁用 App Engine dev_appserver 上的内置截止日期?

c# - 在 C# 中获取用户输入并将其添加到数组

arrays - 如何在 Ruby 中递归查找二维数组的排列

我可以在 C 中创建一个 Char 指针数组吗?

java - 是否可以通过这种方式检查二维数组中的所有元素是否相同?

python - 无法定义使创建字典更容易的函数

python - 字符串中替换的条件

javascript - 按人工顺序对 JavaScript 数组进行排序

c - 为什么即使将数组名称与其索引交换也可以使用数组?