python数据分析库:numpy与pandas使用讲解
1.简介
Numpy库是进行数据分析的基础库,panda库就是基于Numpy库的,在计算多维数组与大型数组方面使用最广,还提供多个函数操作起来效率也高
2.Numpy库的安装
linux(Ubuntu和debian)下:sudo apt-get install python-numpy
linux(fedora)下:sudo yum install numpy scipy
conda isntall numpy
3.ndarray,numpy的核心
array方法下的几个属性 >>> a=np.array([1,2,3]) >>> a array([1, 2, 3]) >>> type(a) >>> a.dtype dtype('int32') >>> a.ndim 1 >>> a.size 3 >>> a.shape (3,) >>> a.itemsize 4 ###如何创建数组 >>> c=np.array([[1,2,3],[4,5,6]]) 列表为参数 >>> c array([[1, 2, 3], [4, 5, 6]]) >>> c=np.array(((1,2,3),(4,5,6))) 元组也可以作为参数 >>> c array([[1, 2, 3], [4, 5, 6]]) ###在创建数组的时候也可以指定类型,常用 都有int-,int8,int16,int32,int64,float_,float16,32,64,uint8,16,32,64 >>> c=np.array([[1,2,3],[4,5,6]],dtype=complex) >>> c array([[ 1.+0.j, 2.+0.j, 3.+0.j], [ 4.+0.j, 5.+0.j, 6.+0.j]]) >>> c.dtype dtype('complex128') >>> c.dtype.name 'complex128'
自带数组创建方法
>>> np.zeros((3,3)) array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) >>> np.ones((3,3)) array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> np.arange(0,10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(0,12,3) array([0, 3, 6, 9]) >>> np.arange(0,4,0.6) array([ 0. , 0.6, 1.2, 1.8, 2.4, 3. , 3.6]) >>> np.arange(0,12).reshape(3,4) array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> np.linspace(0,10,5) array([ 0. , 2.5, 5. , 7.5, 10. ]) >>> np.random.random(6) array([ 0.90252601, 0.85271104, 0.17201238, 0.9884257 , 0.74112411, 0.28453949]) >>> np.random.random((3,3)) array([[ 0.98041444, 0.40374122, 0.1174572 ], [ 0.8121098 , 0.24770467, 0.9823125 ], [ 0.22909469, 0.96560959, 0.47319287]])
4.说完了数组的创建方法,下面讲下数组的计算方法
>>> a=np.arange(4) >>> a array([0, 1, 2, 3]) 算术运算符 >>> a+4 array([4, 5, 6, 7]) >>> a*2 array([0, 2, 4, 6]) >>> a array([0, 1, 2, 3]) >>> a*a array([0, 1, 4, 9]) >>> b=np.arange(4,8) >>> b array([4, 5, 6, 7]) >>> a*np.sin(b) array([-0. , -0.95892427, -0.558831 , 1.9709598 ]) >>> a*np.sqrt(b) array([ 0. , 2.23606798, 4.89897949, 7.93725393]) 矩阵相乘 >>> A=np.arange(9).reshape(3,3) >>> A array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> B=np.ones((3,3)) >>> B array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> A*B array([[ 0., 1., 2.], [ 3., 4., 5.], [ 6., 7., 8.]]) >>> np.dot(A,B) array([[ 3., 3., 3.], [ 12., 12., 12.], [ 21., 21., 21.]]) >>> A array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> a array([0, 1, 2, 3]) 自增自减运算符 >>> a+=4 >>> a array([4, 5, 6, 7]) >>> a*=2 >>> a array([ 8, 10, 12, 14]) 通用函数 >>> np.sin(a) array([ 0.98935825, -0.54402111, -0.53657292, 0.99060736]) >>> np.sqrt(a) array([ 2.82842712, 3.16227766, 3.46410162, 3.74165739]) >>> np.log(a) array([ 2.07944154, 2.30258509, 2.48490665, 2.63905733]) 聚合函数 >>> a.sum() 44 >>> a.min() 8 >>> a.max() 14 >>> a.mean() 11.0 >>> a.std() 2.2360679774997898 >>>
5.索引机制,切片和迭代方法
>>> np.arange(9) array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 一维数组根据索引取数 >>> a=np.arange(9) >>> a[2] 2 >>> a[[2,3,4]] array([2, 3, 4]) >>> A=np.arange(10,19).reshape((3,3)) >>> A array([[10, 11, 12], 矩阵根据索引取数 [13, 14, 15], [16, 17, 18]]) >>> A[1,2] 15 >>> A[[1,2],[2,2]] array([15, 18])
2)切片操作(所谓切片,就是用冒号隔开的数字置于方括号里)
>>> a=np.arange(10,16) 一维数组的切片操作 >>> a array([10, 11, 12, 13, 14, 15]) >>> a[1:5] array([11, 12, 13, 14]) >>> a[1:5:2] array([11, 13]) >>> a[::2] array([10, 12, 14]) >>> a[:5:2] array([10, 12, 14]) >>> a[:5:] array([10, 11, 12, 13, 14])
二维数组矩阵的切片
>>> A=np.arange(10,19).reshape((3,3)) >>> A[0,:] array([10, 11, 12]) >>> A array([[10, 11, 12], [13, 14, 15], [16, 17, 18]]) >>> A[:,0] array([10, 13, 16]) >>> A[0:2,0:2] 行列的切片 array([[10, 11], [13, 14]]) >>> A[[0,2],0:2] 行,或列的不连续切片 array([[10, 11], [16, 17]])
6数组的遍历方法
>>> for i in a: print(i) 10 11 12 13 14 15 >>> for row in A: print(row) [10 11 12] [13 14 15] [16 17 18] >>> for item in A.flat: print(item) 10 11 12 13 14 15 16 17 18 >>> np.apply_along_axis(np.mean,axis=0,arr=A) 更优雅的迭代方法,应用自定义函数 array([ 13., 14., 15.]) >>> np.apply_along_axis(np.mean,axis=1,arr=A) array([ 11., 14., 17.]) >>> def foo(x): return x/2 >>> np.apply_along_axis(foo,axis=1,arr=A) array([[ 5. , 5.5, 6. ], [ 6.5, 7. , 7.5], [ 8. , 8.5, 9. ]])
7.对数组的的元素应用条件,返回boolean值
>>> A=np.random.random((4,4)) >>> A array([[ 0.70709738, 0.80240902, 0.94803025, 0.98312311], [ 0.07900716, 0.93118649, 0.75250378, 0.35555096], [ 0.66154306, 0.96191193, 0.15286704, 0.44050484], [ 0.87358818, 0.23117656, 0.59518599, 0.58695854]]) >>> A<0.5 array([[False, False, False, False], [ True, False, False, True], [False, False, True, True], [False, True, False, False]], dtype=bool) >>> A[A<0.5] array([ 0.07900716, 0.35555096, 0.15286704, 0.44050484, 0.23117656])
8.我们可以通过reape()方法来改变以为数组的形状,也可以通过修改shape这个属性字段来修改
>>> a array([ 0.70290611, 0.79908059, 0.67798575, 0.67487014, 0.77510071, 0.87493472, 0.25405607, 0.38421272, 0.05605654, 0.14063901, 0.11186545, 0.76120191]) >>> a.shape=(3,4) >>> a array([[ 0.70290611, 0.79908059, 0.67798575, 0.67487014], [ 0.77510071, 0.87493472, 0.25405607, 0.38421272], [ 0.05605654, 0.14063901, 0.11186545, 0.76120191]]) >>> a.shape (3, 4) >>> a=a.ravel() >>> a array([ 0.70290611, 0.79908059, 0.67798575, 0.67487014, 0.77510071, 0.87493472, 0.25405607, 0.38421272, 0.05605654, 0.14063901, 0.11186545, 0.76120191]) >>> a.shape=(12) >>> a array([ 0.70290611, 0.79908059, 0.67798575, 0.67487014, 0.77510071, 0.87493472, 0.25405607, 0.38421272, 0.05605654, 0.14063901, 0.11186545, 0.76120191]) >>> A array([[ 0.70709738, 0.80240902, 0.94803025, 0.98312311], [ 0.07900716, 0.93118649, 0.75250378, 0.35555096], [ 0.66154306, 0.96191193, 0.15286704, 0.44050484], [ 0.87358818, 0.23117656, 0.59518599, 0.58695854]]) >>> A.transpose() 矩阵的转置函数 array([[ 0.70709738, 0.07900716, 0.66154306, 0.87358818], [ 0.80240902, 0.93118649, 0.96191193, 0.23117656], [ 0.94803025, 0.75250378, 0.15286704, 0.59518599], [ 0.98312311, 0.35555096, 0.44050484, 0.58695854]]) >>>
9.数组的连接,1)上下对接2)左右对接 原理是运用了栈这个概念,一个是水平栈,一个是垂直栈,有两种方法,一个是vstack,hstack,另一个是column_stack,row_stack
>>> A=np.zeros((3,3)) >>> B=np.ones((3,3)) >>> np.vstack((A,B)) array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> np.hstack((A,B)) array([[ 0., 0., 0., 1., 1., 1.], [ 0., 0., 0., 1., 1., 1.], [ 0., 0., 0., 1., 1., 1.]]) >>> np.column_stack((A,B)) array([[ 0., 0., 0., 1., 1., 1.], [ 0., 0., 0., 1., 1., 1.], [ 0., 0., 0., 1., 1., 1.]]) >>> np.row_stack ((A,B)) array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
9.数组的切分,数组切分其实是数组连接的逆操作
两种方法:1)hsplist(),vsplist() 2)split() 此方法更强大,能指定参数分割成不对称的两个部分
>>> A=np.arange(16).reshape((4,4)) >>> A array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> [B,C]=np.hsplit(A,2) >>> B array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]) >>> C array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]]) >>> [B,C]=np.vsplit(A,2) >>> B array([[0, 1, 2, 3], [4, 5, 6, 7]]) >>> C array([[ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> [A1,A2,A3]=np.split(A,[1,3],axis=1) split函数指定从1,3开始分割,1代表列,0代表行 >>> A1 array([[ 0], [ 4], [ 8], [12]]) >>> A2 array([[ 1, 2], [ 5, 6], [ 9, 10], [13, 14]]) >>> A3 array([[ 3], [ 7], [11], [15]]) >>> [A1,A2,A3]=np.split(A,[1,3],axis=0) >>> A1 array([[0, 1, 2, 3]]) >>> A2 array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> A3 array([[12, 13, 14, 15]])
10.对象的副本与视图,在numpy库中我们队数组的操作并不会在原来的数组上创建副本,而是得到原来数组的视图,当我们改变原来的数组时,新的数组也会随之发生改变,包括切片也是 ,需要区别的是,Python列表操作得到的是副本,如果想要得到numpy中数组的副本,用copy函数
>>> a=np.arange(4) >>> a array([0, 1, 2, 3]) >>> b=a >>> b array([0, 1, 2, 3]) >>> a[0]=1 >>> b[0] 1 >>> c=a.copy() 用copy()来得到副本 >>> a array([1, 1, 2, 3]) >>> c array([1, 1, 2, 3]) >>> a[0]=0 >>> c array([1, 1, 2, 3]) >>> a array([0, 1, 2, 3])
10.numpy数组的 广播机制(broadcasting)
当两个数组形状不相同时,我们可以用广播机制进行运算,广播机制会自动将数组进行补全
补全规则:1)应用广播机制也是有条件的,需要两个数组在以为条件下等长,如不是,则会抛出异常
2)为缺失的维度补上一个1,如下,将b变成4*1
3)为缺失元素用已有值进行填充,将b变成4个【0,1,2,3】
>>> A array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> b=np.arange(4) >>> A+b array([[ 0, 2, 4, 6], [ 4, 6, 8, 10], [ 8, 10, 12, 14], [12, 14, 16, 18]]) >>>
11。结构化数组
除了一维数组,二维数组,还可以创建更复杂的结构体数组,其中每个元素都是一个结构体,下面阐述下结构体的类型
>>> structued=np.array([(1,'first',0.5,1+2j),(2,'second',1.3,2-2j),(3,'third',8.3,4-2j)],dtype=('i2,a6,f4,c8')) >>> structued array([(1, b'first', 0.5 , 1.+2.j), (2, b'second', 1.29999995, 2.-2.j), (3, b'third', 8.30000019, 4.-2.j)], dtype=[('f0', '>> structued[1] (2, b'second', 1.29999995, 2.-2.j) >>> structued[2] (3, b'third', 8.30000019, 4.-2.j) >>> structued['f0'] array([1, 2, 3], dtype=int16) >>> structued['f1'] array([b'first', b'second', b'third'], dtype='|S6') >>> structued=np.array([(1,'first',0.5,1+2j),(2,'second',1.3,2-2j),(3,'third',8.3,4-2j)],dtype=[('id','>> structued array([(1, b'first', 0.5 , 1.+2.j), (2, b'second', 1.29999995, 2.-2.j), (3, b'third', 8.30000019, 4.-2.j)], dtype=[('id', '>> structued.dtype.names ('id', 'position', 'value', 'complex') >>> structued['position'] 通过一个关键字来获取所有结构体元素的值 array([b'first', b'second', b'third'], dtype='|S6')
12.numpy文件的数据读与写
两种方式1)二进制文件的读与写 2)从文件中读取数据text,csv
>>> np.save('c:A',A) 保存到文件中 >>> load_data=np.load('c:A.npy') 从文件中读取 ,np模块保存的是二进制数据 >>> load_data array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> data=np.genfromtxt('c:333.csv',delimiter=',',names=True) genfromtxt()这个方法只能读取数字,对于字符串类型的则便成为NAN >>> data array([( 0., nan, 12., nan), ( 1., nan, 24., nan), ( 2., nan, 25., nan)], dtype=[('A', '>> data['A'] array([ 0., 1., 2.]) >>> data[0] ( 0., nan, 12., nan) >>>
上一篇: 关于SSH框架的一些整合要点
下一篇: Python基础学习之迭代器
推荐阅读
-
python数据分析库:numpy与pandas使用讲解
-
【python】numpy中的array格式数据切片与pandas中的dataframe格式数据切片、相互转换
-
Python语言编程学习:numpy中的array格式数据切片与pandas中的dataframe格式数据切片、相互转换
-
python数据分析Numpy库的常用操作
-
Python数据分析常用库-pandas库基础操作
-
使用python控制数据库(SQLite)方法讲解
-
sql与各个nosql数据库使用场景的讲解
-
使用python的pandas库读取csv文件保存至mysql数据库
-
荐 Python之数据分析(Numpy中读取与保存数据文件、将数据文件制成K线图)
-
荐 14天数据分析与机器学习实践之Day02——数据分析处理库Pandas应用总结