在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]
)
答案 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。