切片除第n个以外的所有项目

时间:2019-02-19 21:32:53

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

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

但是相反的做法呢?我想选择除第n个以外的所有项目。

例如:

[::n]

a = [1, 2, 3, 4, 5, 6, 7, 8] 将导致a[2::3]

现在我想相反:[3, 6]

上面的数组只是一个示例。解决方案应适用于张量流中尺寸较大的矩阵(批,宽度,高度,通道)。选择仅在通道上完成。我的矩阵还包含非唯一的实数值。我也无法将其重塑到比二维([1, 2, 4, 5, 7, 8]

还要深的地方。

3 个答案:

答案 0 :(得分:4)

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

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在张量流中类似地实现这一点:

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张量 [批处理,宽度,高度,通道] ,以通过第四轴(即channels)进行选择,则可以设置axis=3

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

答案 1 :(得分:1)

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

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

请记住,此操作不会修改原始数组:

  

返回一个新的数组,该数组具有沿轴删除的子数组。对于一个   维数组,这将返回那些不由返回的条目   arr [obj]。

答案 2 :(得分:1)

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。