切片除第 n 个之外的每个项目
Slice every item except every nth
在tensorflow中,可以select每第n个项目使用切片符号[::n]
。
但是反过来怎么办呢?我想 select 除了第 n 个之外的每个项目。
例如:
a = [1, 2, 3, 4, 5, 6, 7, 8]
a[2::3]
会导致 [3, 6]
现在我想要相反的:[1, 2, 4, 5, 7, 8]
上面的数组只是一个例子。解决方案应该适用于张量流中维度 [batch, width, height, channels] 的更大矩阵。 selection 仅在通道上完成。此外,我的矩阵包含非唯一的实数值。除了二维 ( [batch, channels]
)
之外,我也无法将其进一步整形
一种选择是通过测试范围索引来创建布尔索引:
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 张量 [batch, width, height, channels] 例如,到 select 第四轴,即 channels
,你可以设置 axis=3
:
mask = ~tf.equal(tf.range(a.shape[-1]) % step, start)
tf.boolean_mask(a, mask, axis=3)
您可以使用np.delete()方法:
>>> np.delete(a, a[1::3])
array([1, 2, 4, 5, 7, 8])
记住这个操作不会修改原来的数组:
Return a new array with sub-arrays along an axis deleted. For a one
dimensional array, this returns those entries not returned by
arr[obj].
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。
在tensorflow中,可以select每第n个项目使用切片符号[::n]
。
但是反过来怎么办呢?我想 select 除了第 n 个之外的每个项目。
例如:
a = [1, 2, 3, 4, 5, 6, 7, 8]
a[2::3]
会导致 [3, 6]
现在我想要相反的:[1, 2, 4, 5, 7, 8]
上面的数组只是一个例子。解决方案应该适用于张量流中维度 [batch, width, height, channels] 的更大矩阵。 selection 仅在通道上完成。此外,我的矩阵包含非唯一的实数值。除了二维 ( [batch, channels]
)
一种选择是通过测试范围索引来创建布尔索引:
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 张量 [batch, width, height, channels] 例如,到 select 第四轴,即 channels
,你可以设置 axis=3
:
mask = ~tf.equal(tf.range(a.shape[-1]) % step, start)
tf.boolean_mask(a, mask, axis=3)
您可以使用np.delete()方法:
>>> np.delete(a, a[1::3])
array([1, 2, 4, 5, 7, 8])
记住这个操作不会修改原来的数组:
Return a new array with sub-arrays along an axis deleted. For a one dimensional array, this returns those entries not returned by arr[obj].
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。