关于numpy的bincount函数的绝对有逻辑地保姆级解释

文章讲述了作者在使用numpy的bincount函数时遇到的困惑,揭示了该函数实际上计算的是数组中每个索引出现的次数,包括加权情况。通过实例和详细解释,帮助读者理解其背后的逻辑。

今天接触到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,我们就下次再见吧。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值