两个脑洞大开的例子

两个脑洞大开的例子_第1张图片

这是菜鸟学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]),)

下标偏大数子,同理我们可以求出正常范围的,偏胖的,肥胖的,然后多次随机看看它们的分布情况

两个脑洞大开的例子_第2张图片



我多次运算,发现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).最后过滤一下重复的,我们看源码

两个脑洞大开的例子_第3张图片

还有一种解法,也是利用numpy的另外一种函数,有兴趣的同学可以先独立思考一下,需要源码的跟我联系

思考题:

1.上面的算法如何优化

2.四维的九宫格,就是行列对角线和为34的,是不是也可以这样破解呢,说说你的理由

Numpy实战小例子就讲到这里,通过两个小例子是不是对numpy的运用又加深了一些如果说numpy是辆性能强劲的跑车,那我们接下来要介绍的pandas就是超级战斗机,哈哈~~好,今天的文章若有什么不懂的,也可以留言跟我交流.

更多精彩内容,源码分享,请关于微信公众号"菜鸟学python"

你可能感兴趣的:(两个脑洞大开的例子)