Numpy和删除具有idendical值的行的最佳方法
我在和numpy lib斗争 我有一个形状的张量(批量大小、时间步长、特征): 例如,让我们创建一个虚拟对象: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] [
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]
vsx[,:,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文档——然后问像这样的好问题,并提供一个很好的最小重复性示例(谢谢你)。