欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python数据分析库:numpy与pandas使用讲解

程序员文章站 2024-01-16 23:22:34
1.简介 Numpy库是进行数据分析的基础库,panda库就是基于Numpy库的,在计算多维数组与大型数组方面使用最广,还提供多个函数操作起来效率也高 2.Numpy库的安装...

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)
>>>