穆里奇两个脑洞大开的例子-菜鸟学python

作品分类:全部文章 2018-02-25

两个脑洞大开的例子-菜鸟学python
这是菜鸟学Python的第80篇原创文章
阅读本文大概需要3分钟
上一篇对Numpy讲了一大堆的知识点和各种花式的函数用法,小伙伴是不是看的眼花缭乱,确实学一门语言需要掌握很多库函数的用法,这么多函数怎么记得住呢,所以多写代码多运用,会比较好一些。今天我自己想了2个小例子地狱学园,招招都是对针对numpy的实践运用,小伙伴们快操练起来吧
1.1000人的身高体重指数
相信大家都听过BMI指数吧,我们假设有1000个,我们随机出这个1000人的身高和体重,然后用Numpy来分析一下人间小可,看看如何处理
1).1000人的身高
我们用numpy里面的随机函数random里的randint模拟一个1000人身高的数组,身高在150cm-190cm之间
import numpy as np
arr_height=np.random.randint(150,190,size=1000)
>>
[181 162 180 183 176 177 165...
因为bmi指数里的身高都是单位是米,所以我们稍微处理一下
arr_height=np.random.randint(150,190,size=1000)/100
>>
[1.81 1.62 1.80 1.83 1.76 1.77 1.65...
2).1000人的体重
我们用numpy里面的随机函数random里的randint模拟一个1000人的体重数组,体重在50公斤-90公斤之间
arr_weight=np.random.randint(50,90,size=1000)
>>
[73 89 52 70 64 86 75 66 88 65...
3).看看平均身高,体重
mean_height=arr_height.mean()
print mean_height
>>1.69497
mean_weight=arr_weight.mean()
print mean_weight
>>69.281
我随机3次,发现每次的平均身高都是在1.69左右,体重在70左右,看来这两个数字应该是铁杆均值
4).有多少人是低于均值的
print len(arr_height[arr_height<mean_height])
>>501
print len(arr_height[arr_height<mean_weight])
>>499
5).计算BMI
体质指数(BMI)=体重(kg)÷身高^2(m)
EX:70kg÷(1.75×1.75)=22.86
成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖, 高于32
用numpy就非常容易轻松搞定
bmi=arr_weight/(arr_height**2)
#看一下偏瘦的有多少:
print bmi[bmi<18.5]
>>
[ 16.51689482 16.17777235 18.41390718 18.39067451 15.94990548
15.15628128 17.70397729...
thin_len=len(np.where(bmi<18.5)[0])
print thin_len
>>130
#偏瘦的分布,看下标
print np.where(bmi<18.5)
>>
(array([ 26, 35, 47, 63, 68, 69, 71, 74, 77, 78, 84, 92, 102,
112, 123, 132, 133, 138, 147奈蔻, 156, 165, 181, 186, 189, 191, 192,
193十戒诗 , 208, 223, 226, 237, 246, 247, 259, 260, 268, 273天作之莓, 286, 293,
299, 301, 303, 314, 324, 326, 342, 343, 346, 347, 359,乔丽娅 365, 375,
379, 389, 392, 394, 435, 439, 443, 467, 476, 479, 489, 493, 515,
523, 529, 530, 534, 540, 547, 560, 565, 584, 591, 596, 599, 608,
632, 643, 644, 672, 678, 683, 684, 710, 722, 735我是小甜甜 , 746, 752, 756,
763, 766, 775, 776, 781, 786七日复仇, 798, 809, 820, 844, 854, 858, 865,
869, 870, 877, 896, 919, 921, 926, 928, 930, 946, 955, 957, 959,
960, 962, 963猛龙特囧, 968, 970, 973鞑靼牛排, 978, 984, 994, 999]),)
下标偏大数子,同理我们可以求出正常范围的,偏胖的,肥胖的,然后多次随机看看它们的分布情况

我多次运算,发现BMI正常的指数始终不超过15%绝命速递 ,有点意思
2.九宫格
一直看过我的文章的同学应该还记得,我曾经写过一篇九宫格的破解的方法,算是暴力破解,九宫格也是3*3的矩阵,我们用numpy来破解试试看
1).首先我们从1-9这个数字中找出遍历找出所有3个数字的组合,并且计算和为15
import itertools
nums=[x for x in range(1,10)]
sequence_3nums=[p for p in itertools.permutations(nums, 3) if sum(p) == 15]
print len(sequence_3nums)
>>48
利用迭代神器itertools很容易搞定穆里奇 ,也就是说有48种组合,我们可以认为是48*3的一个大的矩阵
2),从48行中各选出3行来,形成一个新的3*3矩阵
for row1 in sequence_3nums:
for row2 in sequence_3nums:
for row3 in sequence_3nums:
np_array_3d=np.array([row1,row2,row3])
3).计算3*3矩阵的行,列,对角线的和
if sum(np_array_3d[:,0])==15#第一行
and sum(np_array_3d[:,1])==15#第二行
and np_array_3d.trace()==15#主对角线
and np_array_3d[0,2]+np_array_3d[1,1]+np_array_3d[2矮人矿坑,0]==15:#斜对角线
4).最后过滤一下重复的,我们看源码

还有一种解法,也是利用numpy的另外一种函数,有兴趣的同学可以先独立思考一下,需要源码的跟我联系
思考题:
1.上面的算法如何优化
2.四维的九宫格,就是行列对角线和为34的,是不是也可以这样破解呢,说说你的理由
用Numpy实战小例子就讲到这里,通过两个小例子是不是对numpy的运用又加深了一些,如果说numpy是辆性能强劲的跑车,那我们接下来要介绍的pandas就是超级战斗机,哈哈~~好,今天的文章若有什么不懂的,也可以留言跟我交流.
历史人气文章
菜鸟学Python入门教程大盘点|7个多月的心血总结
同学,学Python真的不能这样学
用Python写个弹球的游戏
Python写个迷你聊天机器人|生成器的高级用法
用Python破解微软面试题|24点游戏
2道极好的Python算法题|带你透彻理解装饰器的妙用
一道Google的算法题 |Python巧妙破解
长按二维码,关注【菜鸟学python】

来源 | 菜鸟学Python
作者 | xinxin
本文章为菜鸟学Python独家原创稿件,未经授权不得转载

意见反馈