【问题标题】:Tensorflow multi-dimensional indexing by another tensor另一个张量的Tensorflow多维索引
【发布时间】:2018-03-03 03:38:01
【问题描述】:

说,我有一个形状为 [n1, n2, ..., nk] 的秩-k 张量 X 和一个形状为 [n2, n3, ..., nk] 的秩-(k-1) 张量 IDX ,其中 IDX 与 X 的最后 (k-1) 个维度具有相同的形状。 IDX 的条目都是 [0, n1) 中的整数。我想从 X 中获取一些值,其中第一个维度位置由 IDX 指定,而其他维度则全部迭代。

例子:

X = tf.constant([[1,2], [3,4], [5,6],
                 [7,8], [9,10],[11,12]]) # 2 x 3 x 2 tensor
IDX = tf.constant([[1,0], [1,1], [0,1]]) #     3 x 2 tensor
...
# would like to get [[7,2],[9,10],[5,12]]

如何在 Tensorflow 中有效地实现这一点?谢谢!

【问题讨论】:

    标签: python numpy indexing tensorflow


    【解决方案1】:

    你看到choose的注释了吗?

    注意事项

    为了减少误解的机会,即使以下 名义上支持“滥用”,choices 既不应该也不应该 被认为是单个数组,即最外层的类似序列的容器 应该是列表或元组。

    也就是说,他们希望你这样对待它:

    In [432]: list(X)
    Out[432]: [array([1, 2]), array([3, 4]), array([5, 6])]
    In [433]: np.choose(IDX,list(X))
    Out[433]: array([3, 6])
    

    索引等价物是:

    In [436]: X[IDX,np.arange(2)]
    Out[436]: array([3, 6])
    

    choose 也有一些mode 选项。

    文档还说它相当于(减去这些模式问题):

    np.choose(a,c) == np.array([c[a[I]][I] for I in ndi.ndindex(a.shape)])
    

    choose 的另一个细微差别。它不能使用超过 32 个选项。

    In [440]: np.choose(IDX,np.ones((33,2)))
    ...
    ValueError: Need at least 1 and at most 32 array objects.
    
    In [442]: np.ones((33,2))[IDX,np.arange(2)]
    Out[442]: array([ 1.,  1.])
    

    【讨论】:

    • 感谢您的回复。我意识到我误解了 np.choose() 函数。现在的问题是如何在 Tensorflow 中有效地实现我想要的。有没有cmets?
    • 这没有回答关于 tensorflow 的问题,而不是 numpy
    • @dopexxx,原始问题专门询问了np.choose,以及是否存在tensorflow 等价物。了解choose 与寻找等价物相关。答案没有因原始问题的重大编辑而改变。如果您有什么要贡献的,请随时添加您自己的答案。
    【解决方案2】:

    您可以将np.choose() 包装在python 函数中,并使用tf.py_func() 将其嵌入到您的张量流图中。但是,如果您希望对图形进行自动梯度计算以供您使用,您也可以为您的函数定义梯度。我想,为np.choose() 定义渐变可能是一项非常棘手的任务,如果实际上可以解决的话。

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 2020-09-23
      • 2016-06-20
      • 1970-01-01
      • 2021-11-25
      • 2021-01-22
      • 1970-01-01
      • 2018-08-23
      • 2019-02-19
      相关资源
      最近更新 更多