如何计算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])
如果你知道他们只是0
和1
:
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个数组。 一个与价值本身,其他与相应的频率。