如何统计以下数组中数字0和1的数量?
y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
y.count(0)
的输出为:
numpy.ndarray
对象没有count
属性。
如何统计以下数组中数字0和1的数量?
y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
y.count(0)
的输出为:
numpy.ndarray
对象没有count
属性。
没有人建议使用 numpy.bincount(input, minlength)
并且将 minlength = np.size(input)
,但它似乎是一个很好的解决方案,而且肯定是最快的:
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.max(x))
之间的加速非常惊人!np.histogram
不会计算相同的内容。很抱歉,无法将我提出的三种方法与 histogram
函数进行比较。 - Næreenbincount
只适用于整数,因此它适用于提问者的问题,但可能不适用于标题中描述的通用问题。另外,您尝试过在具有非常大整数的数组上使用 bincount
吗? - Imperishable Nightunique
方法需要5.84毫秒±33.6微秒
每次循环;而使用bincount
方法只需要231微秒±16.3微秒
。另外,就像@ImperishableNight提到的一样,使用bincount
方法时需要添加.astype(int)
。 - CN_Cabbage要计算出现次数,您可以使用np.unique(array, return_counts=True)
:
In [75]: boo = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
# use bool value `True` or equivalently `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
我会使用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
函数,将y转换为列表后再使用该函数是一种简单的解决方案。
试试这个:
a = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
list(a).count(1)
另一个简单的解决方案可能是使用 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
不要被名称所误导,如果像示例中一样与布尔值一起使用,它就能做到。
利用Series提供的方法:
>>> import pandas as pd
>>> y = [0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]
>>> pd.Series(y).value_counts()
0 8
1 4
dtype: int64
>>> counts = {int(value): list(y).count(value) for value in set(y)}
>>> print(counts)
{0: 8, 1: 4}
这将创建一个字典,以您的ndarray中的值作为键,并将该值在数组中出现次数作为相应的值。
每当您想要计算此格式的数组中值的出现次数时,都可以使用此方法。
np.mean(x)
该函数为您提供数组中数字1的百分比。或者,使用
np.sum(x)
np.sum(1-x)
将为您提供数组中1和0的绝对数量。
dict(zip(*numpy.unique(y, return_counts=True)))
这里只是复制了Seppo Enarvi的评论,他的评论值得成为一个合适的答案
numpy.count_nonzero
函数。 - Mong H. Ng