这是菜鸟学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
>>501
print len(arr_height[arr_height
>>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"