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
Numpy和删除具有idendical值的行的最佳方法_Numpy_Tensorflow - Fatal编程技术网

Numpy和删除具有idendical值的行的最佳方法

Numpy和删除具有idendical值的行的最佳方法,numpy,tensorflow,Numpy,Tensorflow,我在和numpy lib斗争 我有一个形状的张量(批量大小、时间步长、特征): 例如,让我们创建一个虚拟对象: x = np.arange(42).reshape(2,7,3) #now make some rows have homogeneous values x[:,::3,:] =0 x[:,::5,:] =2 现在我需要一种numpysh方式(可以在tensorflow中重复)来删除所有值都相同的行(axis=-2)。所以最后我需要一个张量,像这样: [[[ 3 4 5] [

我在和numpy lib斗争

我有一个形状的张量(批量大小、时间步长、特征):

例如,让我们创建一个虚拟对象:

x = np.arange(42).reshape(2,7,3)
#now make some rows have homogeneous values
x[:,::3,:] =0
x[:,::5,:] =2
现在我需要一种numpysh方式(可以在tensorflow中重复)来删除所有值都相同的行(axis=-2)。所以最后我需要一个张量,像这样:

[[[ 3  4  5]
  [ 6  7  8]
  [12 13 14]]

 [[24 25 26]
  [27 28 29]
  [33 34 35]]]
谢谢。
注意,这与“删除所有零行”的问题不同。因为这里我们讨论的是具有homo值的行。这有点棘手。

可能有一种更聪明的方法,只使用
numpy
。但是,您可以在第二维度上迭代并进行比较

not_same= []
for n in range(x.shape[1]): # iterate over the 2nd dimension
    # test if it is homogeneous i.e. first value equal all values
    not_same.append(~np.all(x[:,n,:] ==x[0,n,0]))
out = x[:,not_same,:]
这将为您提供:

array([[[ 3,  4,  5],
        [ 6,  7,  8],
        [12, 13, 14]],

       [[24, 25, 26],
        [27, 28, 29],
        [33, 34, 35]]])

如果您不介意丢失一维(以便阵列保持均匀),则可以执行以下操作:

x[~np.all(x == x[:, :, 0, np.newaxis], axis=-1)]
# out:
[[ 3  4  5]
 [ 6  7  8]
 [12 13 14]
 [24 25 26]
 [27 28 29]
 [33 34 35]]
信贷:@unutbu's,这里适应了另一个维度


为什么要删除第三维度?想象一下,如果您的条件是希望从第一个数组中选择2行,从第二个数组中选择3行:那么结果将是异构的,必须将其存储为屏蔽数组或数组列表。

numpy
通常不会生成参差不齐的数组,如果没有结构化输入,
axis=-2
维度也可能不相等(即,如果
x[0]
中的行数比
x[1]
中的行数多,或者反之亦然),那么
tensorflow
将在相同的限制条件下阻塞。是否确实始终从每个
轴=0
维度删除相同数量的行?否,每个批次中要删除的行数不同:(但是你提到了这一点,我意识到我没有想到“ragged array”输出……谢谢你的提示。但是如果我们只讨论numpy呢(让我们暂时不讨论TF)?这回答了你的问题吗?我可以自己进行比较,但出于某种原因删除会使事情变得更难。据我所知,numpy的全部目的是避免手动迭代…但这是一件好事。谢谢。@coobit同意,但我想不出一种方法来输出x并保持尺寸不变。请参见h折叠其中一个维度。这里的一行很好。谢谢。但是这个新轴在
x[:,:,0,np.newaxis]
中做了什么?这是为了保持形状的兼容性。比较:
x[:,:,0]
vs
x[,:,0,np.newaxis]
:前者不能与
x
相比,但后者可以。一般来说,
np.newaxis
None
用于引入新维度(在本例中,是丢失的最后一个维度)。它允许我们循环最后一个维度(等于1)在比较过程中。您可以稍微修改它并保持维度一致。但是您必须调用
np.all
两次。
x[:,~np.all(np.all(x==x[0,:,0,np.newaxis],axis=-1,axis=0),:]
该死,这个x[,:,0,np.newaxis]诀窍!!!我到底在哪里可以把numpy学习到这样的水平?所有的书都只是基本功能的表面修饰…@coobit:我认为你做的是对的:在SO上寻找答案并查看numpy文档——然后问像这样的好问题,并提供一个很好的最小重复性示例(谢谢你)。