1、1Python数据分析- NumPy2Numpy 简介 NumPy 是什么? NumPy的安装3NumPy 是什么?NumPy是Python的一种开源的数值计算扩展库。它包含很多功能: 创建n维数组(矩阵) 对数组进行函数运算 数值积分 线性代数运算 傅里叶变换 随机数产生4NumPy 是什么?NumPy是在1995年诞生的Python库Numeric的基础上建立起来的。但真正促使NumPy的发行的是Python的SciPy库。SciPy是2001年发行的一个类似于Matlab,Maple,Mathematica等数学计算软件的Python库,它实现里面的大多数功能。但SciPy中并没有合适的
2、类似于Numeric中的对于基础的数据对象处理的功能。于是,SciPy的开发者将SciPy中的一部分和Numeric的设计思想结合,在2005年发行了NumPy。5NumPy 是什么?标准的Python中用list(列表)保存值,可以当做数组使用,但因为列表中的元素可以是任何对象,所以浪费了CPU运算时间和内存。NumPy诞生为了弥补这些缺陷。它提供了两种基本的对象:ndarray:全称(n-dimensional array object)是储存单一数据类型的多维数组。ufunc:全称(universal function object)它是一种能够对数组进行处理的函数。NumPy的官方文档
3、:6 NumPy 的安装Anaconda里面已经安装过NumPy。原生的Python安装: 在cmd中输入 pip install numpy 在官网中下载相关版本安装 安装之后,我们用导入这个库 import numpy as np np._version_1.11.3并且查看版本:7ndarray 对象 ndarray的创建 ndarray的属性 ndarray的切片 多维数组 结构数组8ndarray的创建NumPy中的核心对象是ndarray。ndarray可以看成数组,类似于R语言的向量或者矩阵。NumPy里面所有的函数都是围绕ndarray展开的。 a = np.array(1,
4、2, 3, 4) b = np.array(5, 6, 7, 8) c = np.array(1, 2, 3, 4, 5, 6, 7, 8) b c - -5, 6, 7, 8 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10ndarray对维数没有限制。 从内到外分别为第0轴,第1轴,第2轴。c第0轴长度为3,第1轴长度为4。9ndarray的创建NumPy提供了专门用于生成ndarray的函数,提高创建ndarray的速度。 a = np.arange(0, 1, 0.1)array( 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0
5、.8, 0.9) b = np.linspace(0, 1, 10)array( 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ) c = np.linspace(0, 1, 10, endpoint=False)array( 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9) d = np.logspace(0, 2, 5)array( 1. , 3.16227766, 10., 31.
6、6227766 , 100.)10ndarray的创建np.empty(2,3), np.int)创建2*3的整形型空矩阵,只分配内存np.zeros(4, np.int)创建长度为4,值为全部为0的矩阵np.full(4, np.pi)创建长度为4,值为全部为pi的矩阵 def func(i): return i % 4 + 1 np.fromfunction(func, (10,)array( 1., 2., 3., 4., 1., 2., 3., 4., 1., 2.)还可以自定义函数产生ndarray。fromfunction第一个参数接收计算函数,第二个参数接收数组的形状。11nda
7、rray的属性ndarray的元素具有相同的元素类型。常用的有int(整型),float(浮点型),complex(复数型)。 a = np.array(1, 2, 3, 4, dtype=float)array( 1., 2., 3., 4.) a.dtypedtype(float64)ndarray的shape属性用来获得它的形状,也可以自己指定。 c = np.array(1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10) c.shape(3, 4) a = np.array(1, 2, 3, 4) d = a.reshape(2,2)array(1, 2, 3,
8、4)12ndarray的切片ndarray的切片和list是一样的。 a = np.arange(10) aarray(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)a5 a3:5 a:5 a:-1 - - - -5 3, 4 0, 1, 2, 3, 4 0, 1, 2, 3, 4, 5, 6, 7, 8 a1:-1:2 a:-1 a5:1:-2- - -1, 3, 5, 7 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 5, 3 可以通过切片的对ndarray中的元素进行更改。 a2:4 = 100, 101 aarray( 0, 1, 100, 101, 4, 5,
9、 6, 7, 8, 9)13ndarray的切片ndarray通过切片产生一个新的数组b,b和a共享同一块数据存储空间。 b = a3:7 b2 = -10 b a - -101, 4, -10, 6 0, 1, 100, 101, 4, -10, 6, 7, 8, 9如果想改变这种情况,我们可以用列表对数组元素切片。 b = a3, 3, -3, 8 barray(3, 3, 7, 8) b2 = 100b a - -3, 3, 100, 8 0, 1, 2, 3, 4, 5, 6, 7, 8, 914多维数组NumPy的多维数组和一维数组类似。多维数组有多个轴。我们前面已经提到从内到外分别
10、是第0轴,第1轴 a = np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)array( 0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25, 30, 31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 45, 50, 51, 52, 53, 54, 55)a0, 3:5 a4:, 4: a2:2, :2 - - -3, 4 44, 45, 20, 22, 24, 54, 55 40, 42, 44#上面方法对于数组的切片都是共享原数
11、组的储存空间的。15多维数组如果我们想创立原数组的副本,我们可以用整数元组,列表,整数数组,布尔数组进行切片。16结构数组C语言中可以通过struct关键字定义结构类型。NumPy中也有类似的结构数组。 persontype = np.dtype( names:name, age, weight, formats:S30,i, f) a = np.array(Zhang, 32, 75.5), (Wang, 24, 65.2), dtype=persontype) 我们就创建了一个结构数组,并且可以通过索引得到每一行。nameageweight0zhang3275.51wang2465.2 p
12、rint a0(Zhang, 32, 75.5)17ufunc函数 ufunc简介 四则运算 比较运算和布尔运算 自定义ufunc函数 广播(broadcasting)18ufunc简介ufunc是universal function的简称,它是一种能对数组每个元素进行运算的函数。NumPy的许多ufunc函数都是用C语言实现的,因此它们的运算速度非常快。 x = np.linspace(0, 2*np.pi, 10) y = np.sin(x) yarray( 0.00000000e+00, 6.42787610e-01, 9.84807753e-01,. . . . . , -2.4492
13、9360e-16)值得注意的是,对于同等长度的ndarray,np.sin()比math.sin()快但是对于单个数值,math.sin()的速度则更快。19四则运算NumPy提供了许多ufunc函数,它们和相应的运算符运算结果相同。 a = np.arange(0, 4) b = np.arange(1, 5) np.add(a, b)array(1, 3, 5, 7) a+barray(1, 3, 5, 7) np.subtract(a, b) # 减法 np.multiply(a, b) # 乘法 np.divide(a, b) # 如果两个数字都为整数,则为整数除法 np.power(
14、a, b) # 乘方20比较运算和布尔运算使用=,对两个数组进行比较,会返回一个布尔数组,每一个元素都是对应元素的比较结果。 np.array(1, 2, 3) np.array(3, 2, 1)array( True, False, False, dtype=bool)布尔运算在NumPy中也有对应的ufunc函数。表达式ufunc函数y=x1=x2equal(x1,x2,y)y=x1!=x2not_equal(x1,x2,y)y=x1x2less(x1,x2,y)y=x1x2greater(x1,x2,y)y=x1=x2gerater_equal(x1,x2,y)21自定义ufunc函数N
15、umPy提供的标准ufunc函数可以组合出复合的表达式,但是有些情况下,自己编写的则更为方便。我们可以把自己编写的函数用frompyfunc()转化成ufunc函数。 def num_judge(x, a): #对于一个数字如果是3或5的倍数就 if x%3 = 0: 返回0,否则返回a。 r = 0 elif x%5 = 0: r = 0 else: r = a return r x = np.linspace(0, 10, 11) y = np.array(num_judge(t, 2) for t in x)#列表生成式array(0, 2, 2, 0, 2, 0, 0, 2, 2, 0
16、, 0)22自定义ufunc函数使用frompyfunc()进行转化,调用格式如下: numb_judge = np.frompyfunc(num_judge, 2, 1) y = numb_judge(x,2)array(0, 2, 2, 0, 2, 0, 0, 2, 2, 0, 0, dtype=object)frompyfunc(func, nin, nout)func:计算函数nin:func()输入参数的个数nout:func()输出参数的个数因为最后输出的元素类型是object,所以我们还需要把它转换成整型。y.astype(np.int)23广播(broadcasting)使用u
17、func对两个数组进行运算时,ufunc函数会对两个数组的对应元素进行运算。如果数组的形状不相同,就会进行下广播处理。简而言之,就是向两个数组每一维度上的最大值靠齐。24广播(broadcasting)25广播(broadcasting)我们看一下具体的例子: a = np.arange(0, 60, 10).reshape(-1, 1) b = np.arange(0, 5) c = a+bc c.shape- - 0, 1, 2, 3, 4, (6, 5) 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31, 32, 33, 34, 40, 41,
18、 42, 43, 44, 50, 51, 52, 53, 54 26广播(broadcasting)ogrid用来生成广播运算所用的数组。 x, y = np.ogrid:5, :5x y - -0, 0, 1, 2, 3, 4 1, 2, 3, 4 下面操作和a.reshape(1,-1), a.reshape(-1,1)相同 。 a = np.arange(4)aNone, : a:, None- -0, 1, 2, 3 0,1,2,3 27NumPy的函数库 随机数 求和,平均值,方差 大小与排序 统计函数 操作多维数组 多项式函数28随机数除了前面介绍的ufunc()函数之外,NumP
19、y还提供了大量对于数组运算的函数。它们能够简化逻辑,提高运算速度。我们首先看随机数。NumPy产生随机数的模块在random里面,其中有大量的分布。 from numpy import random as nr np.set_printoptions(precision=2) #显示小数点后两位数 r1 = nr.rand(4, 3) 0.87, 0.42, 0.34, 0.25, 0.87, 0.42, 0.49, 0.18, 0.44, 0.53, 0.23, 0.81 r2 = nr.poisson(2.0, (4, 3)3, 1, 5,2, 2, 3,2, 4, 4,2, 2, 329
20、随机数rand0到1之间的随机数normal正太分布的随机数randint制定范围内的随机整数uniform均匀分布randn标准正太的随机数poisson泊松分布choice随机抽取样本shuffle随机打乱顺序30求和,平均值,方差NumPy在均值等方面常用的函数如下: np.random.seed(42) a = np.random.randint(0,10,size=(4,5) np.sum(a)96函数名功能sum求和average加权平均数var方差mean期望std标准差product连乘积31求和,平均值,方差a - 6, 3, 7, 4, 6, 9, 2, 6, 7, 4,
21、3, 7, 7, 2, 5, 4, 1, 7, 5, 1 np.sum(a, axis=1) np.sum(a, axis=0) - -26, 28, 24, 18 22, 13, 27, 18, 16keepdims可以保持原来数组的维数。np.sum(a,1,keepdims=True) np.sum(a,0,keepdims=True)- -26, 22, 13, 27, 18, 16 28, 24, 18 32大小与排序NumPy在排序等方面常用的函数如下: a = np.array(1, 3, 5, 7) b = np.array(2, 4, 6) np.maximum(aNone,
22、 :, b:, None)#maxinum返回两组array(2, 3, 5, 7, 矩阵广播计算后的 4, 4, 5, 7, 结果 6, 6, 6, 7)函数名功能函数名功能min最小值max最大值ptp极差argmin最小值的下标mininum二元最小值maxinum二元最大值sort数组排序argsort数组排序下标percentile分位数median中位数min,max都有axis,out,keepdims等参数,我们来看其他函数。33大小与排序sort()对数组进行排序会改变数组的内容,返回一个新的数组。axis的默认值都为-1,即按最终轴进行排序。axis=0对每列上的值进行排序
23、。np.sort(a) np.sort(a, axis=0)- -3, 4, 6, 6, 7, 3, 1, 6, 2, 1, 2, 4, 6, 7, 9, 4, 2, 7, 4, 4, 2, 3, 5, 7, 7, 6, 3, 7, 5, 5, 1, 1, 4, 5, 7 9, 7, 7, 7, 6 percentile计算处于p%上的值。 r = np.abs(np.random.randn(100000) np.percentile(r, 68.3, 95.4, 99.7)array( 1.00029686, 1.99473003, 2.9614485 )34统计函数NumPy中常用的统计
24、函数有:unique(), bicount(), histogram()。我们来一个个介绍。首先看unique(): np.random.seed(42) a = np.random.randint(0, 8, 10) np.unique(a)a np.unique(a) - -6, 3, 4, 6, 2, 7, 4, 4, 6, 1 1, 2, 3, 4, 6, 7unique有两个参数,return_index=True同时返回原始数组中的下标,return_inverse=True表示原始数据在新数组的下标。 x, index = np.unique(a, return_index=Tr
25、ue)x index aindex - - -1, 2, 3, 4, 6, 7 9, 4, 1, 2, 0, 5 1, 2, 3, 4, 6, 735统计函数 x, rindex = np.unique(a, return_inverse=True) rindex xrindex - -4, 2, 3, 4, 1, 5, 3, 3, 4, 0 6, 3, 4, 6, 2, 7, 4, 4, 6, 1bincount()对非负整数数组中的各个元素出现的次数进行统计,返回数组中的第i个元素是整数i出现的次数。 a = np.array(6, 3, 4, 6, 2, 7, 4, 4, 6, 1) n
26、p.bincount(a)array(0, 1, 1, 1, 3, 0, 3, 1) x = np.array(0 , 1, 2, 2, 1, 1, 0) w = np.array(0.1, 0.3, 0.2, 0.4, 0.5, 0.8, 1.2) np.bincount(x, w)array( 1.3, 1.6, 0.6)36统计函数histogram()对以为数组进行直方图统计,其参数为:histogram(a, bins=10, range=None, weights=None)函数返回两个一维数组,hist是每个区间的统计结果, bin_edges返回区间的边界值。 a = np.r
27、andom.rand(100) np.histogram(a, bins=5, range=(0, 1)(array(28, 18, 17, 19, 18), array( 0. , 0.2, 0.4, 0.6, 0.8, 1. ) np.histogram(a, bins=0, 0.4, 0.8, 1.0) (array(46, 36, 18), array( 0. , 0.4, 0.8, 1. )37操作多维数组多维数组可以进行连接,分段等多种操作。我们先来看vstack(),hstack(),column_stack()函数。 a = np.arange(3) b = np.arange
28、(10, 13) v = np.vstack(a, b) # 按第1轴连接数组 h = np.hstack(a, b) # 按第0轴连接数组 c = np.column_stack(a, b) # 按列连接多个一维数组 v h c - - - 0, 1, 2, 0, 1, 2, 10, 11, 12 0, 10, 10, 11, 12 1, 11, 2, 1238操作多维数组split()函数进行分段。 a = np.array(6, 3, 7, 4, 6, 9, 2, 6, 7, 4, 3, 7) b = np.array( 1, 3, 6, 9, 10 np.split(a, idx) #
29、 按元素位置进行分段array(6), array(3, 7), array(4, 6, 9),array(2, 6, 7),array(4), array(3, 7) np.split(a, 2) # 按数组个数进行分段array(6, 3, 7, 4, 6, 9), array(2, 6, 7, 4, 3, 7)39多项式函数多项式函数是整数的次幂与系数的乘积,如:f(x)= an(xn)+ an-1(x(n-1)+ a1(x)+ a0NumPy中多项式函数可以用一维数组表示。a0为最高次,a-1为常数项。 a = np.array(1.0, 0, -2, 1) p = np.poly1d
30、(a) print type(p) p(np.linspace(0, 1, 5) array( 1. , 0.515625, 0.125 , -0.078125, 0. )多项式函数可以进行四则运算,其中运算的列表自动化成多项式函数。40多项式函数 p + -2, 1poly1d( 1., 0., -4., 2.) p * ppoly1d( 1., 0., -4., 2., 4., -4., 1.) p / 1, 1 # 分别为商和余(poly1d( 1., -1., -1.), poly1d( 2.)多项式也可以进行积分和求导。 p.deriv()poly1d( 3., 0., -2.) p
31、.integ() poly1d( 0.25, 0. , -1. , 1. , 0. )41多项式函数Roots可以求多项式的根。 r = np.roots(p) rarray(-1.61803399, 1. , 0.61803399)polyfit()可以对数据进行多项式拟合。x, y为数据点,deg为多项式最高阶数。 a = np.polyfit(x , y, deg)poly()返回多项式系数构成的数组。 a = np.poly(x )4243 结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。When You Do Your Best, Failure Is Great, So DonT Give Up, Stick To The End44谢谢大家荣幸这一路,与你同行ItS An Honor To Walk With You All The Way演讲人:XXXXXX 时 间:XX年XX月XX日