【问题标题】:Numpy and The best way to remove rows with idendical valuesNumpy 和删除具有相同值的行的最佳方法
【发布时间】:2021-03-18 18:33:34
【问题描述】:

我正在努力使用 numpy lib。

我有一个形状的张量(batch_size、timestep、feature):

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

x = np.arange(42).reshape(2,7,3)
#now make some rows have homogeneous values
x[:,::3,:] =0
x[:,::5,:] =2

现在我需要一种 numpyish 方式(在 tensorflow 中可重复)来删除所有值都相同的行(axis=-2)。所以最后我需要一个张量看起来像这样:

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

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

谢谢。 附言这与“删除所有零行”不是同一个问题。因为这里我们讨论的是具有均值的行。这有点棘手。

【问题讨论】:

  • numpy 通常不会生成参差不齐的数组,并且在没有结构化输入的情况下,axis = -2 的维度可能不相等(即,如果要放入 x[0] 的行数多于x[1] 或反之亦然)
  • 另外,tensorflow 也会因同样的限制而窒息。您确定总是从每个 axis = 0 维度中删除相同数量的行吗?
  • 否,每批要删除的行数不同。 :( 但是你已经提到了这一点,我意识到我没有考虑过“参差不齐的数组”输出......谢谢你的提示。但是如果我们只讨论 numpy 怎么办(让我们把 TF 排除在外)一会儿)?
  • 我可以自己进行比较,但由于某种原因删除使事情变得更加困难。

标签: numpy tensorflow


【解决方案1】:

可能有更聪明的方法,只使用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]]])

【讨论】:

  • 据我所知,numpy 的全部目的是避免手动迭代......但它是一些东西。谢谢。
  • @coobit 同意,但我想不出一种输出 x 并保持尺寸不变的方法。请参阅折叠其中一个维度的另一个答案。
【解决方案2】:

如果您可以接受丢失一维(以便您的数组保持同质),那么您可以这样做:

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 的 answer to a similar problem,这里适应了更多维度。

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

【讨论】:

  • 这里不错的单线器。谢谢。但是这个 newaxis 在x[:, :, 0, np.newaxis] 做什么呢?
  • 这是为了保持形状兼容。比较:x[:, :, 0] vs x[:, :, 0, np.newaxis]:前者不能与x比较,但后者可以。一般来说,np.newaxisNone 用于引入一个新维度(在我们的例子中,是丢失的最后一个维度)。它允许我们在比较期间循环最后一个维度(等于 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 文档——然后用一个很好的最小可重复示例提出像这样的好问题(谢谢你为此)。
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2011-05-19
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多