我如何计算以下数组中的0和1的数量?
y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
y.count(0)为:
numpy。Ndarray对象没有属性计数
我如何计算以下数组中的0和1的数量?
y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
y.count(0)为:
numpy。Ndarray对象没有属性计数
当前回答
如果你对最快的执行感兴趣,你提前知道要查找哪个(s)值,并且你的数组是1D,或者你对扁平数组上的结果感兴趣(在这种情况下,函数的输入应该是np.ravel(arr)而不仅仅是arr),那么Numba是你的朋友:
import numba as nb
@nb.jit
def count_nb(arr, value):
result = 0
for x in arr:
if x == value:
result += 1
return result
或者,对于非常大的数组,并行化可能是有益的:
@nb.jit(parallel=True)
def count_nbp(arr, value):
result = 0
for i in nb.prange(arr.size):
if arr[i] == value:
result += 1
return result
可以对np.count_nonzero()(它也有创建临时数组的问题——这是Numba解决方案中避免的问题)和基于np.unique()的解决方案(与其他解决方案相反,它实际上计算所有唯一值值)进行基准测试。
import numpy as np
def count_np(arr, value):
return np.count_nonzero(arr == value)
import numpy as np
def count_np_uniq(arr, value):
uniques, counts = np.unique(a, return_counts=True)
counter = dict(zip(uniques, counts))
return counter[value] if value in counter else 0
由于Numba支持“类型化”字典,也可以使用一个函数来计数所有元素的所有出现次数。 这更直接地与np.unique()竞争,因为它能够在一次运行中计算所有值。这里提出了一个最终只返回单个值的元素数量的版本(为了比较,类似于count_np_uniq()中所做的事情):
@nb.jit
def count_nb_dict(arr, value):
counter = {arr[0]: 1}
for x in arr:
if x not in counter:
counter[x] = 1
else:
counter[x] += 1
return counter[value] if value in counter else 0
输入是通过以下方式生成的:
def gen_input(n, a=0, b=100):
return np.random.randint(a, b, n)
时间报告在下面的图中(第二行图是对更快的方法的放大):
表明简单的基于numba的解决方案对于较小的输入是最快的,而并行版本对于较大的输入是最快的。 NumPy版本在所有规模上都相当快。
当需要计算数组中的所有值时,对于足够大的数组,np.unique()比手动使用Numba实现的解决方案性能更好。
编辑:在最近的版本中,NumPy解决方案似乎变得更快了。在以前的迭代中,简单的Numba解决方案对于任何输入大小都优于NumPy的方法。
完整的代码可以在这里找到。
其他回答
对于您的情况,还可以查看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, i.e. 8
#count of ones is at index 1, i.e. 4
老实说,我发现最容易转换为熊猫系列或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()
要计算出现的次数,可以使用np。独特的(数组,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
将数组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
using numpy.count
$ a = [0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]
$ np.count(a, 1)