Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 除第n个项目外,对每个项目进行切片_Python_Tensorflow_Multidimensional Array_Tensor_Tensor Indexing - Fatal编程技术网

Python 除第n个项目外,对每个项目进行切片

Python 除第n个项目外,对每个项目进行切片,python,tensorflow,multidimensional-array,tensor,tensor-indexing,Python,Tensorflow,Multidimensional Array,Tensor,Tensor Indexing,在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,Channel])一

在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,Channel]

一个选项是通过测试a范围索引来创建布尔索引:

import numpy as np
start, step = 2, 3
a[np.arange(len(a)) % step != start]
# array([1, 2, 4, 5, 7, 8])
您可以使用
tf.boolean\u 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张量,则可以使用
布尔_掩码
指定轴;例如,使用4D张量[批次、宽度、高度、通道],通过第四个轴进行选择,即
通道
,您可以设置
轴=3

mask = ~tf.equal(tf.range(a.shape[-1]) % step, start)
tf.boolean_mask(a, mask, axis=3)
您可以使用以下方法:

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

返回一个沿轴删除子数组的新数组。一个人 维度数组,返回未由 arr[obj]

的普通应用程序适用于
int
dtype的1D数组

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])
相应的张量流当量为



要处理nD数组(即张量),您可以首先将其重塑为1D数组,使用
setdiff1d
进行选择,然后将结果重塑为nD。

如答案所示,您可以构建要保留的项的列表(或布尔掩码)。产生的选择将是原始选择的副本。它不会是一个
视图
(会产生
::n
)。对不起,我的问题不明确。我只是在寻找tensorflow中的一个解决方案。我无法将其重塑为二维(因为批处理)。我至少将
[批次、频道]
作为维度。但更重要的是,我的矩阵包含实际值
tf.setdiff1d
对此不起作用。
tf.boolean\u mask
唯一的问题是最后一个维度未知(
None
)。我使用了
tensor.set_shape(…)
来解决这个问题(需要根据我掌握的信息计算新的形状)
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])