两个脑洞大开的例子

浏览: 1307

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

来源 | 菜鸟学Python

推荐 0
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册