两个脑洞大开的例子

作者: 菜鸟学python | 来源:发表于2017-05-17 22:19 被阅读255次

    这是菜鸟学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"

    相关文章

      网友评论

        本文标题:两个脑洞大开的例子

        本文链接:https://www.haomeiwen.com/subject/pqjjxxtx.html