计算特定值的出现次数并同时将其删除

时间:2017-04-12 13:47:40

标签: python numpy find-occurrences

我想在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

还有更优化的方法吗?

2 个答案:

答案 0 :(得分:-1)

这样的东西? 像你一样使用numpy可能会更加优化。

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

答案 1 :(得分:-1)

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

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来确定它将返回多少个值。

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