【问题标题】:How to elegantly drop unnecessary elements in numpy?如何优雅地删除 numpy 中不必要的元素?
【发布时间】:2019-11-24 02:20:48
【问题描述】:

我有一个形状为[batch_size, seq_len, num_features] 的ndarray。但是,顺序维度末尾的某些元素不是必需的,因此我想删除它们并将顺序维度合并到批处理维度中。比如我要操作的ndarraya就是

batch_size = 2
seq_len = 3
num_features = 1
a = np.random.randn(batch_size, seq_len, num_features)
mask = np.ones((batch_size, seq_len), dtype=np.bool)
mask[0][1:] = 0
mask[1][2:] = 0
"""
>>> a = [[[-0.3908401 ]
  [ 0.89686512]
  [ 0.07594243]]

 [[-0.12256737]
  [-1.00838131]
  [ 0.56543754]]]
mask=[[ True False False]
 [ True  True False]]
"""

其中mask用于表示a中的元素是否有用。我可以使用以下代码得到我想要的东西

res = []
for seq, m in zip(a, mask):
    res.append(seq[:sum(m)])
np.concatenate(res, axis=0)
"""
>>>array([[0.08676509],
       [0.47162315],
       [0.98070665]])
"""

我想知道在 numpy 中是否有更优雅的方法来做到这一点?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    不确定这是否是您的要求,但结果看起来不错

    res = a[mask]

    【讨论】:

    • 只是添加到这个答案中,这是因为您要加入的 2 维是前 2 维。在 (d1,...,dn) 数组上执行此操作时更通用使用例如 (d3,d4) 掩码,您应该执行类似 res = a[:,:,mask] 的操作
    • 感谢您极其简洁的回答:)
    【解决方案2】:

    由于与批处理和序列相关的维度将被合并,您可以将amask 重塑为形状为(batch_size * seq_len, num_features) 的二维数组。

    接下来,只需使用布尔索引过滤重要样本。见代码:

    mask2d = mask.reshape(-1) # or mask.ravel()
    a2d = a.reshape(-1, num_features)
    result = a2d[mask2d]
    

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2023-02-05
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多