今天接触到numpy包中的一个函数bincount很有意思,因为我压根没看懂文档里说这个函数咋用,看了几个博客、查了好几个小时,差点把自己气死,也没搞清楚,于是决定自己搞清楚逻辑。
函数具体样式与参数要求如下:
numpy.bincount(x, /, weights=None, minlength=0)
'''
x是输入的array,
weight是赋予的权重,
minlength是输出的out要求最短长度
'''
话不多说,先看官方文档(numpy版本1.23.0),如下图:

在文档中表示,这个函数就是用来数一个array(数组)中出现的值的次数的,但是我一跑代码样例,聪明的小脑袋瓜就发现问题:
>>> np.bincount(np.array([0, 1, 1, 3, 2, 1, 7]))
array([1, 3, 1, 1, 0, 0, 0, 1])
上边代码跑的是个啥?!其实,这个代码跑的不是数你的array数组中出现了的整数的重复次数,而是数的是(array中的最大值+1)个索引的每个索引在array中出现的次数。比如,上个代码中,array的最大值是7,所以索引有8个,为0~7;索引0在array中出现的次数是1次,所以输出的out[0]=1,其他值如何得来,以此类推。
这个逻辑已经够绕了吧?还没完,我们看第二个参数,在文档的第二段话里有说,如果给定weight,那么输入数组就要加权,输出的也要根据weight改变。我的妈呀,什么i什么n?谁的i谁的n?都是什么?!
不用管文档啥意思,文档说了等于没说,我们直接看样例:
>>> x = np.array([2, 1, 3, 4, 4, 3])
# x中最大的数为4,因此bin的数量为5,索引值为0->4
>>> w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6])
>>> np.bincount(x,weights=w)
array([ 0. , 0.5, 0.3, -0.4, 1.7])
看到上边的代码我直接崩溃了,你咋算出来这个值的?这个就涉及一个逻辑,在weight的参数解释中要求weight和x等长,所以weight和x对应寻值,既然out[n]+=weight[i],那就是说索引是要从out身上下手,具体逻辑如下图:

逻辑大概是,因为out的长度其实是取决于x的max的,所以,out的索引是直接在x中找的,x能找到的值就对应weight中一样的位置,直接加起来就是最终out的数值,看文字很绕,大家还是直接看图吧。
第三个参数就很简单了,指的是输出的out最短限制是多短,这个其实无所谓,你就算array的max是5,你输入的minlength是100,除非对应index有数否则都是0,很好理解。
好了,这个函数的使用到此结束,官方文档网址如下:https://numpy.org/doc/stable/numpy-ref.pdf,我们就下次再见吧。
文章讲述了作者在使用numpy的bincount函数时遇到的困惑,揭示了该函数实际上计算的是数组中每个索引出现的次数,包括加权情况。通过实例和详细解释,帮助读者理解其背后的逻辑。

4929





