zoukankan      html  css  js  c++  java
  • Python数据分析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的核心

     1 array方法下的几个属性
     2 >>> a=np.array([1,2,3])
     3 >>> a
     4 array([1, 2, 3])
     5 >>> type(a)
     6 <class 'numpy.ndarray'>
     7 >>> a.dtype
     8 dtype('int32')
     9 >>> a.ndim
    10 1
    11 >>> a.size
    12 3
    13 >>> a.shape
    14 (3,)
    15 >>> a.itemsize
    16 4

    3,如何创建数组

    1 >>> c=np.array([[1,2,3],[4,5,6]])  列表为参数
    2 >>> c
    3 array([[1, 2, 3],
    4        [4, 5, 6]])
    5 >>> c=np.array(((1,2,3),(4,5,6)))   元组也可以作为参数
    6 >>> c
    7 array([[1, 2, 3],
    8        [4, 5, 6]])

    在创建数组的时候也可以指定类型,常用 都有int-,int8,int16,int32,int64,float_,float16,32,64,uint8,16,32,64

    1 >>> c=np.array([[1,2,3],[4,5,6]],dtype=complex)
    2 >>> c
    3 array([[ 1.+0.j,  2.+0.j,  3.+0.j],
    4        [ 4.+0.j,  5.+0.j,  6.+0.j]])
    5 >>> c.dtype
    6 dtype('complex128')
    7 >>> c.dtype.name
    8 '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.说完了数组的创建方法,下面讲下数组的计算方法

     1 >>> a=np.arange(4)
     2 >>> a
     3 array([0, 1, 2, 3])
    算术运算符
    4 >>> a+4 5 array([4, 5, 6, 7]) 6 >>> a*2 7 array([0, 2, 4, 6]) 8 >>> a 9 array([0, 1, 2, 3]) 10 >>> a*a 11 array([0, 1, 4, 9]) 12 >>> b=np.arange(4,8) 13 >>> b 14 array([4, 5, 6, 7]) 15 >>> a*np.sin(b) 16 array([-0. , -0.95892427, -0.558831 , 1.9709598 ]) 17 >>> a*np.sqrt(b) 18 array([ 0. , 2.23606798, 4.89897949, 7.93725393])
    矩阵相乘
    19 >>> A=np.arange(9).reshape(3,3) 20 >>> A 21 array([[0, 1, 2], 22 [3, 4, 5], 23 [6, 7, 8]]) 24 >>> B=np.ones((3,3)) 25 >>> B 26 array([[ 1., 1., 1.], 27 [ 1., 1., 1.], 28 [ 1., 1., 1.]]) 29 >>> A*B 30 array([[ 0., 1., 2.], 31 [ 3., 4., 5.], 32 [ 6., 7., 8.]]) 33 >>> np.dot(A,B) 34 array([[ 3., 3., 3.], 35 [ 12., 12., 12.], 36 [ 21., 21., 21.]]) 37 >>> A 38 array([[0, 1, 2], 39 [3, 4, 5], 40 [6, 7, 8]]) 41 >>> a 42 array([0, 1, 2, 3])
    自增自减运算符
    43 >>> a+=4 44 >>> a 45 array([4, 5, 6, 7]) 46 >>> a*=2 47 >>> a 48 array([ 8, 10, 12, 14])
    通用函数
    49 >>> np.sin(a) 50 array([ 0.98935825, -0.54402111, -0.53657292, 0.99060736]) 51 >>> np.sqrt(a) 52 array([ 2.82842712, 3.16227766, 3.46410162, 3.74165739]) 53 >>> np.log(a) 54 array([ 2.07944154, 2.30258509, 2.48490665, 2.63905733])
    聚合函数
    55 >>> a.sum() 56 44 57 >>> a.min() 58 8 59 60 >>> a.max() 61 14 62 >>> a.mean() 63 11.0 64 >>> a.std() 65 2.2360679774997898 66 >>>

    5.索引机制,切片和迭代方法

      1)索引机制

     1 >>> np.arange(9)
     2 array([0, 1, 2, 3, 4, 5, 6, 7, 8])   一维数组根据索引取数
     3 >>> a=np.arange(9)
     4 >>> a[2]
     5 2
     6 >>> a[[2,3,4]]
     7 array([2, 3, 4])
     8 >>> A=np.arange(10,19).reshape((3,3))
     9 >>> A
    10 array([[10, 11, 12],        矩阵根据索引取数
    11        [13, 14, 15],
    12        [16, 17, 18]])
    13 >>> A[1,2]
    14 15
    15 >>> A[[1,2],[2,2]]
    16 array([15, 18])

    2)切片操作(所谓切片,就是用冒号隔开的数字置于方括号里)

     1 >>> a=np.arange(10,16)     一维数组的切片操作
     2 >>> a
     3 array([10, 11, 12, 13, 14, 15])
     4 >>> a[1:5]
     5 array([11, 12, 13, 14])
     6 >>> a[1:5:2]
     7 array([11, 13])
     8 >>> a[::2]
     9 array([10, 12, 14])
    10 >>> a[:5:2]
    11 array([10, 12, 14])
    12 >>> a[:5:]
    13 array([10, 11, 12, 13, 14])

    二维数组矩阵的切片

     1 >>> A=np.arange(10,19).reshape((3,3))
     2 >>> A[0,:]
     3 array([10, 11, 12])
     4 >>> A
     5 array([[10, 11, 12],
     6        [13, 14, 15],
     7        [16, 17, 18]])
     8 >>> A[:,0]
     9 array([10, 13, 16])
    10 >>> A[0:2,0:2]     行列的切片
    11 array([[10, 11],
    12        [13, 14]])
    13 >>> A[[0,2],0:2]   行,或列的不连续切片
    14 array([[10, 11],
    15        [16, 17]])

    6数组的遍历方法

     1 >>> for  i in a:
     2     print(i)
     3 
     4     
     5 10
     6 11
     7 12
     8 13
     9 14
    10 15
    11 >>> for row in A:
    12     print(row)
    13 
    14     
    15 [10 11 12]
    16 [13 14 15]
    17 [16 17 18]
    18 >>> for item in A.flat:
    19     print(item)
    20 
    21     
    22 10
    23 11
    24 12
    25 13
    26 14
    27 15
    28 16
    29 17
    30 18
    31 >>> np.apply_along_axis(np.mean,axis=0,arr=A)    更优雅的迭代方法,应用自定义函数
    32 array([ 13.,  14.,  15.])
    33 >>> np.apply_along_axis(np.mean,axis=1,arr=A)
    34 array([ 11.,  14.,  17.])
    35 >>> def foo(x):
    36     return x/2
    37 
    38 >>> np.apply_along_axis(foo,axis=1,arr=A)
    39 array([[ 5. ,  5.5,  6. ],
    40        [ 6.5,  7. ,  7.5],
    41        [ 8. ,  8.5,  9. ]])

    7.对数组的的元素应用条件,返回boolean值

     1 >>> A=np.random.random((4,4))
     2 >>> A
     3 array([[ 0.70709738,  0.80240902,  0.94803025,  0.98312311],
     4        [ 0.07900716,  0.93118649,  0.75250378,  0.35555096],
     5        [ 0.66154306,  0.96191193,  0.15286704,  0.44050484],
     6        [ 0.87358818,  0.23117656,  0.59518599,  0.58695854]])
     7 >>> A<0.5
     8 array([[False, False, False, False],
     9        [ True, False, False,  True],
    10        [False, False,  True,  True],
    11        [False,  True, False, False]], dtype=bool)
    12 >>> A[A<0.5]
    13 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

     1 >>> A=np.zeros((3,3))
     2 >>> B=np.ones((3,3))
     3 >>> np.vstack((A,B))
     4 array([[ 0.,  0.,  0.],
     5        [ 0.,  0.,  0.],
     6        [ 0.,  0.,  0.],
     7        [ 1.,  1.,  1.],
     8        [ 1.,  1.,  1.],
     9        [ 1.,  1.,  1.]])
    10 >>> np.hstack((A,B))
    11 array([[ 0.,  0.,  0.,  1.,  1.,  1.],
    12        [ 0.,  0.,  0.,  1.,  1.,  1.],
    13        [ 0.,  0.,  0.,  1.,  1.,  1.]])
    14 >>> np.column_stack((A,B))
    15 array([[ 0.,  0.,  0.,  1.,  1.,  1.],
    16        [ 0.,  0.,  0.,  1.,  1.,  1.],
    17        [ 0.,  0.,  0.,  1.,  1.,  1.]])
    18 >>> np.row_stack ((A,B))
    19 array([[ 0.,  0.,  0.],
    20        [ 0.,  0.,  0.],
    21        [ 0.,  0.,  0.],
    22        [ 1.,  1.,  1.],
    23        [ 1.,  1.,  1.],
    24        [ 1.,  1.,  1.]])

    9.数组的切分,数组切分其实是数组连接的逆操作

    两种方法:1)hsplist(),vsplist()   2)split()  此方法更强大,能指定参数分割成不对称的两个部分

     1 >>> A=np.arange(16).reshape((4,4))
     2 >>> A
     3 array([[ 0,  1,  2,  3],
     4        [ 4,  5,  6,  7],
     5        [ 8,  9, 10, 11],
     6        [12, 13, 14, 15]])
     7 >>> [B,C]=np.hsplit(A,2)
     8 >>> B
     9 array([[ 0,  1],
    10        [ 4,  5],
    11        [ 8,  9],
    12        [12, 13]])
    13 >>> C
    14 array([[ 2,  3],
    15        [ 6,  7],
    16        [10, 11],
    17        [14, 15]])
    18 >>> [B,C]=np.vsplit(A,2)
    19 >>> B
    20 array([[0, 1, 2, 3],
    21        [4, 5, 6, 7]])
    22 >>> C
    23 array([[ 8,  9, 10, 11],
    24        [12, 13, 14, 15]])
    25 >>> [A1,A2,A3]=np.split(A,[1,3],axis=1)    split函数指定从1,3开始分割,1代表列,0代表行
    26 >>> A1
    27 array([[ 0],
    28        [ 4],
    29        [ 8],
    30        [12]])
    31 >>> A2
    32 array([[ 1,  2],
    33        [ 5,  6],
    34        [ 9, 10],
    35        [13, 14]])
    36 >>> A3
    37 array([[ 3],
    38        [ 7],
    39        [11],
    40        [15]])
    41 >>> [A1,A2,A3]=np.split(A,[1,3],axis=0)
    42 >>> A1
    43 array([[0, 1, 2, 3]])
    44 >>> A2
    45 array([[ 4,  5,  6,  7],
    46        [ 8,  9, 10, 11]])
    47 >>> A3
    48 array([[12, 13, 14, 15]])

    10.对象的副本与视图,在numpy库中我们队数组的操作并不会在原来的数组上创建副本,而是得到原来数组的视图,当我们改变原来的数组时,新的数组也会随之发生改变,包括切片也是 ,需要区别的是,Python列表操作得到的是副本,如果想要得到numpy中数组的副本,用copy函数

     1 >>> a=np.arange(4)
     2 >>> a
     3 array([0, 1, 2, 3])
     4 >>> b=a
     5 >>> b
     6 array([0, 1, 2, 3])
     7 >>> a[0]=1
     8 >>> b[0]
     9 1
    10 >>> c=a.copy()   用copy()来得到副本
    11 >>> a
    12 array([1, 1, 2, 3])
    13 >>> c
    14 array([1, 1, 2, 3])
    15 >>> a[0]=0
    16 >>> c
    17 array([1, 1, 2, 3])
    18 >>> a
    19 array([0, 1, 2, 3])

    10.numpy数组的 广播机制(broadcasting)

    当两个数组形状不相同时,我们可以用广播机制进行运算,广播机制会自动将数组进行补全

    补全规则:1)应用广播机制也是有条件的,需要两个数组在以为条件下等长,如不是,则会抛出异常

          2)为缺失的维度补上一个1,如下,将b变成4*1

         3)为缺失元素用已有值进行填充,将b变成4个【0,1,2,3】

     1 >>> A
     2 array([[ 0,  1,  2,  3],
     3        [ 4,  5,  6,  7],
     4        [ 8,  9, 10, 11],
     5        [12, 13, 14, 15]])
     6 >>> b=np.arange(4)
     7 >>> A+b
     8 array([[ 0,  2,  4,  6],
     9        [ 4,  6,  8, 10],
    10        [ 8, 10, 12, 14],
    11        [12, 14, 16, 18]])
    12 >>> 

    11。结构化数组

    除了一维数组,二维数组,还可以创建更复杂的结构体数组,其中每个元素都是一个结构体,下面阐述下结构体的类型

     1 >>> 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'))
     2 >>> structued
     3 array([(1, b'first',  0.5       ,  1.+2.j),
     4        (2, b'second',  1.29999995,  2.-2.j),
     5        (3, b'third',  8.30000019,  4.-2.j)], 
     6       dtype=[('f0', '<i2'), ('f1', 'S6'), ('f2', '<f4'), ('f3', '<c8')]) 对每一列指定元素的名字与类型,相当于关键字
     7 >>> structued[1]
     8 (2, b'second',  1.29999995,  2.-2.j)
     9 >>> structued[2]
    10 (3, b'third',  8.30000019,  4.-2.j)
    11 >>> structued['f0']
    12 array([1, 2, 3], dtype=int16)
    13 >>> structued['f1']
    14 array([b'first', b'second', b'third'], 
    15       dtype='|S6')
    16 >>> structued=np.array([(1,'first',0.5,1+2j),(2,'second',1.3,2-2j),(3,'third',8.3,4-2j)],dtype=[('id','<i2'),('position','a6'),('value','f4'),('complex','c8')])
    17 >>> structued
    18 array([(1, b'first',  0.5       ,  1.+2.j),
    19        (2, b'second',  1.29999995,  2.-2.j),
    20        (3, b'third',  8.30000019,  4.-2.j)], 
    21       dtype=[('id', '<i2'), ('position', 'S6'), ('value', '<f4'), ('complex', '<c8')])
    22 >>> structued.dtype.names
    23 ('id', 'position', 'value', 'complex')
    24 
    25 >>> structued['position']   通过一个关键字来获取所有结构体元素的值
    26 array([b'first', b'second', b'third'], 
    27       dtype='|S6')

    12.numpy文件的数据读与写

    两种方式1)二进制文件的读与写   2)从文件中读取数据text,csv

    1 >>> np.save('c:A',A)    保存到文件中
    2 >>> load_data=np.load('c:A.npy')   从文件中读取   ,np模块保存的是二进制数据
    3 >>> load_data
    4 array([[ 0,  1,  2,  3],
    5        [ 4,  5,  6,  7],
    6        [ 8,  9, 10, 11],
    7        [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', '<f8'), ('add', '<f8'), ('age', '<f8'), ('name', '<f8')])
    >>> data['A']
    array([ 0.,  1.,  2.])
    >>> data[0]
    ( 0.,  nan,  12.,  nan)
    >>> 
  • 相关阅读:
    求一些数字字符参数的和(Java)
    《大道至简》第二章 读后感
    华为机试题 简单错误记录
    华为机试 购物单
    华为机试题 提取不重复的整数
    华为机试题 合并表结构
    华为机试 取近似值
    华为机试题 质数因子
    华为机试题 进制转换
    华为机试题 字符串分割
  • 原文地址:https://www.cnblogs.com/caojunjie/p/6908269.html
Copyright © 2011-2022 走看看