Python求数组众数

背景

最近有机器学习的任务,不可避免找上了python,语言简单,库多代码简洁,除了运行效率其他的没啥诟病,是个非常理想的机器学习首选开发语言。

入门阶段鄙人基本找的菜鸟教程,w3cschool等,因为其他的我暂时也没那个能力去理解。

在w3cschool的机器学习算法入门篇中,我看到了求数组众数的实现,其利用的是scipy包下的stats模块的mode函数,实现的算法思想是求数组中最小的众数,由于我不知道其还有没有求解所有众数的函数,故此自定义一个,一是满足自身虚荣感,而是填补求知欲。

思想

1.一个字典来维护每个数字出现的次数

2.一个集合来维护众数

3.遍历整个数组,对每个元素记录其出现的次数,若与集合中出现次数最大的数一致,则其也是众数,亦将其加入集合中。若其出现次数最大,则挤兑掉集合中其他数,其成为集合中唯一的元素

4.时间复杂度O(n)【仅遍历数组一次】,空间复杂度O(n)【一个集合,一个字典】

实现

arr=[86,86,86,86,87,87,87,87]

#返回所有众数
def mymode(arr):
	d=dict()
	result=set()
	for item in arr:
		if item in d.keys():
			d[item]+=1
		else:
			d[item]=1
		if len(result)==0:
			result.add(item)
		else:
			pop=result.pop()
			if d[pop]==d[item]:
				result.add(pop)
				result.add(item)
			elif d[pop]>d[item]:
				result=set([item])
	return result,d
	
result,d=mymode(arr)
print(result)
print(d)

 结果

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值