【问题标题】:How to slice tensorflow tensor differently for each row at once?如何一次为每一行以不同的方式切片张量流张量?
【发布时间】:2020-09-04 06:34:35
【问题描述】:

我有简单的张量

a = tf.constant([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])

并想对其进行切片,但我需要对每一行进行不同的操作。这个切片操作由另一个张量描述

b = tf.constant([[0, 1], [2, 4], [2, 5]])

这意味着从张量的第一行a我需要从01的元素,从第二行从24等等。所以最终的最终结果将是

[
  [1],
  [8, 9],
  [13, 14, 15]
]

我的第一个想法是填充切片开始和结束之间的范围,但不幸的是,无法使用 map_fn 进行此操作,因为结果的行具有不同的长度。

有人知道怎么做吗?

【问题讨论】:

    标签: python tensorflow data-science


    【解决方案1】:
    • 基本上我们有两个要迭代的数组。一个包含实际数据,另一个包含要返回的范围。
    • 因此,zip 函数可以帮助从多个数组中逐一迭代元素。
    import tensorflow as tf
    
    a = tf.constant([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
    b = tf.constant([[0, 1], [2, 4], [2, 5]])
    
    # As you iterate, provided a and b have same length
    # [1, 2, 3, 4, 5] sliced as [0:1]
    # [6, 7, 8, 9, 10] sliced as [2:4]
    # [11, 12, 13, 14, 15] sliced as [2:5]
    
    [data.numpy().tolist()[start:end] for data, (start, end) in zip(a,b)]
    

    输出:

    [[1], [8, 9], [13, 14, 15]]
    

    【讨论】:

    • 结果是正确的,但我想要同样的东西而不将张量转换为 numpy 数组;)无论如何,你的答案可能非常有用,谢谢:)
    【解决方案2】:

    如果b 的大小在图形编译时是已知的,那么您可以分别对每一行进行切片。

    import tensorflow as tf
    
    a = tf.constant([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
    b = tf.constant([[0, 1], [2, 4], [2, 5]])
    
    r = []
    for i in range(3):
        bi = b[i]
        r.append(a[i][bi[0]: bi[1]])
    print(r)
    

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多