【问题标题】:Count the occurrences of a specific value and remove them at the same time计算特定值的出现次数并同时删除它们
【发布时间】:2017-04-12 13:47:39
【问题描述】:

我想在一个 numpy 数组中计算特定值(在我的情况下为 -1)的出现次数并同时删除它们。

我可以这样做,所以这就是我所做的:

a = np.array([1, 2, 0, -1, 3, -1, -1])
b = a[a==-1]
a = np.delete(a, np.where(a==-1)) 
print("a -> ", a) # a ->  [1 2 0 3]
print("b -> ", b) # b ->  3

有没有更优化的方法?

【问题讨论】:

  • 您的代码中发生的计数在哪里?要删除-1,只需:a[a!=-1]?
  • @Divakar 我猜,OP 想就地修改数组 a

标签: python numpy find-occurrences


【解决方案1】:

像这样的东西? 不过,像您一样使用 numpy 可能会更优化。

a = [x for x in a if x != -1]

【讨论】:

    【解决方案2】:

    首先,列表就地计数和删除操作:

    In [100]: al=a.tolist(); cnt=0
    In [101]: for i in range(len(a)-1,-1,-1):
         ...:     if al[i]==-1:
         ...:         del al[i]
         ...:         cnt += 1
    
    In [102]: al
    Out[102]: [1, 2, 0, 3]
    In [103]: cnt
    Out[103]: 3
    

    它在原地运行,但必须从头开始工作。列表推导式替代方案会创建一个新列表,但通常更易于编写和阅读。

    最干净的数组操作使用布尔掩码。

    In [104]: idx = a==-1
    In [105]: idx
    Out[105]: array([False, False, False,  True, False,  True,  True], dtype=bool)
    In [106]: np.sum(idx)  # or np.count_nonzero(idx)
    Out[106]: 3
    In [107]: a[~idx]
    Out[107]: array([1, 2, 0, 3])
    

    您必须以一种或另一种方式识别与目标匹配的所有元素。计数是一个微不足道的操作。掩蔽也很容易。

    np.delete 必须被告知要删除哪些项目;并以一种或其他方式构造一个新数组,该数组包含除“已删除”之外的所有数组。由于它的普遍性,它几乎总是比像这种掩蔽这样的直接操作要慢。

    np.where(又名np.nonzeros)使用count_nonzero 来确定它将返回多少个值。

    所以我提出了与你相同的行动,但方式更直接。

    【讨论】:

      猜你喜欢
      • 2022-12-22
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多