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

Python 计算特定值的出现次数,同时将其删除,python,numpy,find-occurrences,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 有没有更优化的方法呢?类似的方法? 不过,像您那样使用n

我想计算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
有没有更优化的方法呢?

类似的方法? 不过,像您那样使用numpy可能会更优化

a = [x for x in a if x != -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\u nonzero
确定它将返回多少值


因此,我建议采取与您相同的行动,但更直接一点。

代码中的计数发生在哪里?要删除
-1
,只需执行以下操作:
a[a!=-1]
?@Divakar我猜,OP想要修改数组
a