【问题标题】:Slice every item except every nth对除每 n 次以外的所有项目进行切片
【发布时间】:2019-07-13 11:42:42
【问题描述】:

在 tensorflow 中,可以使用切片符号 [::n] 选择每第 n 个项目。

但是如何做相反的事情呢?我想选择除每 n 次以外的所有项目。

例如:

a = [1, 2, 3, 4, 5, 6, 7, 8]

a[2::3] 将导致[3, 6]

现在我想要相反的:[1, 2, 4, 5, 7, 8]

上面的数组只是一个例子。解决方案应该适用于 tensorflow 中尺寸 [batch, width, height, channels] 的更大矩阵。仅在通道上进行选择。我的矩阵也包含非唯一的真实值。我也无法将其重塑为二维([batch, channels]

【问题讨论】:

  • 如答案所示,您可以构建要保留的项目列表(或布尔掩码)。生成的选择将是原件的副本。它不会是view::n 会产生)。

标签: python tensorflow multidimensional-array tensor tensor-indexing


【解决方案1】:

一种选择是通过测试范围索引来创建布尔索引:

import numpy as np
start, step = 2, 3
a[np.arange(len(a)) % step != start]
# array([1, 2, 4, 5, 7, 8])

您可以在 tensorflow 中使用 tf.boolean_mask 类似地实现此目的:

import tensorflow as tf

a = tf.constant([1, 2, 3, 4, 5, 6, 7, 8])

start, step = 2, 3
mask = ~tf.equal(tf.range(a.shape[-1]) % step, start)

tf.boolean_mask(a, mask).eval()
# array([1, 2, 4, 5, 7, 8], dtype=int32)

如果a是ND张量,可以用boolean_mask指定轴;以 4D 张量 [batch, width, height, channels] 为例,按第四轴选择,即channels,可以设置axis=3

mask = ~tf.equal(tf.range(a.shape[-1]) % step, start)
tf.boolean_mask(a, mask, axis=3)

【讨论】:

  • tf.boolean_mask 剩下的唯一问题是,最后一个维度是未知的 (None)。我使用tensor.set_shape(...) 解决了这个问题(需要根据我拥有的信息计算新形状)
【解决方案2】:

您可以使用np.delete() 方法:

>>> np.delete(a, a[1::3])
array([1, 2, 4, 5, 7, 8])

记住这个操作不会修改原始数组:

返回一个新数组,其中删除了沿轴的子数组。对于一个 维数组,这将返回那些未返回的条目 arr[obj].

【讨论】:

  • 抱歉,我的问题含糊不清。我只是在 tensorflow 中寻找解决方案。
【解决方案3】:

numpy.setdiff1d() 的普通应用程序将适用于 int dtype 的一维数组。

In [16]: arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

In [17]: np.setdiff1d(arr, arr[2::3])
Out[17]: array([1, 2, 4, 5, 7, 8])

对应的 TensorFlow 等价物是 tf.setdiff1d()


要处理 nD 数组(即张量),您可以先将它们重新整形为一维数组,使用 setdiff1d 进行选择,然后将结果重新整形为 nD。

【讨论】:

  • 我无法将其重塑为二维(因为批处理)。我至少会有[batches, channels] 作为维度。但更重要的是,我的矩阵包含真实值。 tf.setdiff1d 不适用。
猜你喜欢
  • 2020-04-27
  • 2021-02-18
  • 1970-01-01
  • 2018-11-25
  • 2015-08-26
  • 2013-10-22
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
相关资源
最近更新 更多