如何计算Python中的ndarray中某些项目的发生?

在Python中,我有一个打印为array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) 0,0,0,1,0,1,0,0,0,0,1])的ndarray y

我试图计算这个数组中有多less个0和多less个1。

但是当我键入y.count(0)y.count(1) ,它说'numpy.ndarray'对象没有属性'计数'

我该怎么办?

感谢@ali_m和@shredding ,这里是你如何使用numpy来做到这一点:

  >>> a = numpy.array([0, 3, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 3, 4]) >>> unique, counts = numpy.unique(a, return_counts=True) >>> dict(zip(unique, counts)) {0: 7, 1: 4, 2: 1, 3: 2, 4: 1} 

非结块的方式

使用collections.Counter ;

 >> import collections, numpy >>> a = numpy.array([0, 3, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 3, 4]) >>> collections.Counter(a) Counter({0: 7, 1: 4, 3: 2, 2: 1, 4: 1}) 

怎么使用numpy.count_nonzero ,就像

 >>> import numpy as np >>> y = np.array([1, 2, 2, 2, 2, 0, 2, 3, 3, 3, 0, 0, 2, 2, 0]) >>> np.count_nonzero(y == 1) 1 >>> np.count_nonzero(y == 2) 7 >>> np.count_nonzero(y == 3) 3 

我个人认为: (y == 0).sum()(y == 1).sum()

例如

 import numpy as np y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) num_zeros = (y == 0).sum() num_ones = (y == 1).sum() 

对于你的情况,你也可以看看numpy.bincount

 In [56]: a = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) In [57]: np.bincount(a) Out[57]: array([8, 4]) #count of zeros is at index 0 : 8 #count of ones is at index 1 : 4 

将数组y转换为列表l ,然后执行l.count(1)l.count(0)

 >>> y = numpy.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) >>> l = list(y) >>> l.count(1) 4 >>> l.count(0) 8 
 y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) 

如果你知道他们只是01

 np.sum(y) 

给你的数量。 np.sum(1-y)给出了零。

对于一般性,如果你想计数0而不是0(但可能是2或3):

 np.count_nonzero(y) 

给出非零的个数。

但如果你需要更复杂的东西,我不认为numpy会提供一个很好的count选项。 在这种情况下,去集合:

 import collections collections.Counter(y) > Counter({0: 8, 1: 4}) 

这就像一个字典

 collections.Counter(y)[0] > 8 

len(y[y==0])len(y[y==1])呢?

我会使用np.where:

 how_many_0 = len(np.where(a==0.)[0]) how_many_1 = len(np.where(a==1.)[0]) 

y.tolist().count(val)

与val 0或1

由于python列表具有本地函数count ,所以在使用该函数之前转换为列表是一个简单的解决scheme。

另一个简单的解决scheme可能是使用numpy.count_nonzero()

 import numpy as np y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) y_nonzero_num = np.count_nonzero(y==1) y_zero_num = np.count_nonzero(y==0) y_nonzero_num 4 y_zero_num 8 

不要让这个名字误导你,如果你像布尔例子一样使用布尔值,那么它就会成功。

老实说,我觉得最简单的转换为pandas系列或dataframe:

 import pandas as pd import numpy as np df = pd.DataFrame({'data':np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])}) print df['data'].value_counts() 

或者罗伯特·缪尔(Robert Muil)提出的这个很好的一行

 pd.Series([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]).value_counts() 

没有人build议使用numpy.bincount(input, minlength) minlength = np.size(input)minlength = np.size(input) ,但它似乎是一个很好的解决scheme,而且绝对是最快的

 In [1]: choices = np.random.randint(0, 100, 10000) In [2]: %timeit [ np.sum(choices == k) for k in range(min(choices), max(choices)+1) ] 100 loops, best of 3: 2.67 ms per loop In [3]: %timeit np.unique(choices, return_counts=True) 1000 loops, best of 3: 388 µs per loop In [4]: %timeit np.bincount(choices, minlength=np.size(choices)) 100000 loops, best of 3: 16.3 µs per loop 

这是numpy.unique(x, return_counts=True)numpy.bincount(x, minlength=np.size(x))之间的疯狂加速!

它涉及更多的步骤,但是一个更灵活的解决scheme也适用于2d数组和更复杂的filter,就是创build一个布尔型掩码,然后在掩码上使用.sum()。

 >>>>y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) >>>>mask = y == 0 >>>>mask.sum() 8 

这可以通过以下方法轻松完成

 y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) y.tolist().count(1) 

一般而简单的答案是:

 numpy.sum(MyArray==x) # sum of a binary list of the occurence of x (=0 or 1) in MyArray 

这将导致这个完整的代码作为例子

 import numpy MyArray=numpy.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) # array we want to search in x=0 # the value I want to count (can be iterator, in a list, etc.) numpy.sum(MyArray==0) # sum of a binary list of the occurence of x in MyArray 

现在,如果MyArray在多个维度中,并且您想要计算行(=后面的模式)中值的分布的发生,

 MyArray=numpy.array([[6, 1],[4, 5],[0, 7],[5, 1],[2, 5],[1, 2],[3, 2],[0, 2],[2, 5],[5, 1],[3, 0]]) x=numpy.array([5,1]) # the value I want to count (can be iterator, in a list, etc.) temp = numpy.ascontiguousarray(MyArray).view(numpy.dtype((numpy.void, MyArray.dtype.itemsize * MyArray.shape[1]))) # convert the 2d-array into an array of analyzable patterns xt=numpy.ascontiguousarray(x).view(numpy.dtype((numpy.void, x.dtype.itemsize * x.shape[0]))) # convert what you search into one analyzable pattern numpy.sum(temp==xt) # count of the searched pattern in the list of patterns 

如何使用np.unique

 In [75]: boo = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) In [77]: uniq, cnts = np.unique(boo, return_counts=1) In [81]: uniq Out[81]: array([0, 1]) #unique elements in input array are: 0, 1 In [82]: cnts Out[82]: array([8, 4]) # 0 occurs 8 times, 1 occurs 4 times 

既然你的ndarray只包含0和1,你可以使用sum()来得到1s的出现,len() – sum()得到0s的出现。

 num_of_ones = sum(array) num_of_zeros = len(array)-sum(array) 

如果您不想使用numpy或集合模块,则可以使用字典:

 d = dict() a = [0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1] for item in a: try: d[item]+=1 except KeyError: d[item]=1 

结果:

 >>>d {0: 8, 1: 4} 

当然你也可以使用if / else语句。 我认为Counter函数几乎是一样的东西,但这是更透明的。

Numpy有这个模块。 只是一个小黑客。 把你的input数组作为仓。

 numpy.histogram(y, bins=y) 

输出是2个数组。 一个与价值本身,其他与相应的频率。