本章主要说明2个方面的问题:1. 数组的构造及其优势; 2. 常用的数学函数与统计函数;
1、我们为什么要使用Numpy,Numpy具备哪些优势。我们举例说明:我们以人类体重BIM的计算公式为例:BIM指数=体重(kg)/ 身高(m)的平方
height = [170, 175, 174, 180, 195]
weight = [65, 75, 90, 110, 98]
BIM = weight/ (height / 100) ** 2
用上述方法,我们会发现,代码会报错。
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-2-ed365025289f> in <module> 1 height = [170, 175, 174, 180, 195] 2 weight = [65, 75, 90, 110, 98] ----> 3 BIM = weight/ (height / 100) ** 2 TypeError: unsupported operand type(s) for /: 'list' and 'int'w
为什么呢?因为编程语言里列表list是一个容器,并不具备运算功能。这个时候我们通常的做法如下:
height = [170, 175, 174, 180, 195]
weight = [65, 75, 90, 110, 98]
BIM = []
for index in range(len(height)):
BIM.append(weight[index] / (height[index] / 100) ** 2)
BIM
看一下输出结果:
[22.49134948096886,
24.489795918367346,
29.72651605231867,
33.95061728395061,
25.77251808021039]
那有没有更好的办法呢?
我们在这里可以使用Numpy的array函数可以将列表或元组转换为数组。代码如下。
import numpy as np
height = np.array([170, 175, 174, 180, 195])
weight = np.array([65, 75, 90, 110, 98])
BIM = weight/ (height / 100) ** 2
BIM
当然到了这里,会有人疑问,为什么不直接用Python的列表循环来执行呢?Numpy的数组的优势在哪呢?下面我们会用示例来说明。
我们依然以BIM的运算来举例,当我们自定义100万组数据,以100万组数据求BIM值所需要的时间来看一下,用循环的方式和array分别所需时间进行比较。代码如下:
import numpy as np
import random
# 伪造100万组数据
h = []
w = []
for i in range(10000000):
h.append(random.randint(155,188))
w.append(random.uniform(52,95))
使用循环的方式,记录运行时间
%%time
bmi = []
for i in range(10000000):
bmi.append(w[i]/(h[i]/100) ** 2)
这个%%time在jupyter里可以直接使用,记录这一段代码运行所需要的时间,我们可以看到运行的时间:CPU times: user 3.74 s, sys: 264 ms, total: 4 s Wall time: 4.13 s 执行这段代码一共用了4秒。
%%time
H = np.array(h)
W = np.array(w)
BMI = W/(H/100)**2
使用np.array()进行运算,得到的时间:CPU times: user 65.9 ms, sys: 38.4 ms, total: 104 ms Wall time: 118 ms,总共只用了118毫秒,相比python原生的循环,效率快了很多倍(可以自己计算)
综上所述:使用numpy在处理大数据时,会比使用python的列表或者字典,效率都要快很多。