在张量流中,可以使用切片符号[:: n]选择每个第n个项目.
但如何做相反的事情呢?我想选择除每个项目之外的所有项目.
例如:
a = [1, 2, 3, 4, 5, 6, 7, 8]
a [2 :: 3]会导致[3,6]
现在我想反过来说:[1,2,4,5,7,8]
上面的数组只是一个例子.解决方案应该适用于张量流中维度[批次,宽度,高度,通道]的更大矩阵.选择仅在频道上进行.我的矩阵也包含非唯一的实际值.我也无法进一步重塑它而不是二维([批次,渠道])
最佳答案 一种选择是通过测试范围索引来创建布尔索引:
import numpy as np
start, step = 2, 3
a[np.arange(len(a)) % step != start]
# array([1, 2, 4, 5, 7, 8])
您可以使用tf.boolean_mask在tensorflow中类似地实现此目的:
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张量[批次,宽度,高度,通道]来选择第四轴,即通道,你可以设置轴= 3:
mask = ~tf.equal(tf.range(a.shape[-1]) % step, start)
tf.boolean_mask(a, mask, axis=3)