数据分析01

数据分析

  • Numpy+Scipy+Matplotlib+Pandas
  • 基础数值算法 科学计算 数据可视化 序列高级函数

一.Numpy是什么?

  1. Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力
  2. Numpy是其它数据分析及机器学习库的底层库
  3. Numpy完全标准C语言实现,运行效率充分优化
  4. Numpy开源免费,

二.Numpy的历史

  1. 1995年,Numeric,Python语言数值计算扩充
  2. 2001年,Scipy - Numarray,多维数组运算
  3. 2005年,Numeric + Numarray - Numpy
  4. 2006年,Numpy脱离Scipy成为独立的项目

三.Numpy的核心:多维数组

  1. 代码简洁:减少Python代码中的循环
  2. 底层实现:厚内核(c)+薄接口(Python),保证性能
    代码:
    from __future__ import unicode_literals
    import datetime as dt
    import numpy as np
    
    n = 100000
    
    start = dt.datetime.now()
    A,B = [],[]
    for i in range(n):
        A.append(i**2)
        B.append(i**3)
    c = []
    for a,b in zip(A,B):
        c.append(a+b)
    print((dt.datetime.now() - start).microseconds)
    
    
    start = dt.datetime.now()
    A,B = np.arange(n)**2,np.arange(n)**3
    C = A+B
    print((dt.datetime.now() - start).microseconds)

四.Numpy基础

  1. 数组对象
    1. 用np.ndarray类的对象表示n维数组
      实际数据:数组中元素
      元数据:描述数组中的元素
      将实际数据与元数据分开存放,一方面提高了内存空间的使用率,另一方面减少对实际数据的访问频率,提高性能
    2. Numpy数组是同质数组,即所有元素的数据类型必须相同
    3. Numpy数组的下标从0开始,最后一个元素的下标为数组长度减1
    4. np.ndarray.dtype/shape/size:类型/维度/大小
    5. np.arange(起始值(0),终止值,步长(1)) - 等差序列
      np.array(任何可被解释为Numpy数组的逻辑结构) -> 任意维度和类型的数组对象
      代码:
      #维度
      from __future__ import unicode_literals
      import numpy as np
      
      a = np.arange(1,3)
      print(a,a.shape)
      b = np.array([[1,2.,'3'],[4,5,6]])
      print(b,b.shape)
      c=np.array([np.arange(1,4),np.arange(4,7),np.arange(7,10)])
      print(c,c.shape)
      
      
      #[1 2] (2,)
      
      #[['1' '2.0' '3']
      # ['4' '5' '6']] (2, 3)
      
      #[[1 2 3]
      # [4 5 6]
      # [7 8 9]] (3, 3)
      
      
      from __future__ import unicode_literals
      import numpy as np
      
      a = np.arange(1,10)
      print(a,type(a[0]),a.dtype)
      b = a.astype(float)
      print(b,type(b[0]),b.dtype)
      c = b.astype(str)
      print(c,type(c[0]),c.dtype)
      
      #[1 2 3 4 5 6 7 8 9] <class 'numpy.int64'> int64
      #[ 1.  2.  3.  4.  5.  6.  7.  8.  9.] <class 'numpy.float64'> float64
      #['1.0' '2.0' '3.0' '4.0' '5.0' '6.0' '7.0' '8.0' '9.0'] <class 'numpy.str_'> <U32
      
      from __future__ import unicode_literals
      import numpy as np
      
      a = np.array([[10,20,30],[40,50,60]])
      print(a.shape,a.size,len(a))
      
      b = a.reshape((6,))
      print(b.shape,b.size,len(b))
      
      c = b.reshape((3,2))
      print(c,c.shape,c.size,len(c))
      
      d = np.arange(1,25).reshape((2,3,4))
      print(d.shape,d.size,len(d))
      
      #(2, 3) 6 2
      
      #(6,) 6 6
      
      #[[10 20]
      # [30 40]
      # [50 60]] (3, 2) 6 3
      
      #(2, 3, 4) 24 2
      
    6. 元素索引(下标)
      数组对象[...,页号,行号,列号]
      数组对象.shape - >(...,页数,行数,列数)
      X号:[0,X数-1]
      代码:
       

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      import numpy as np
      a = np.array([[[1, 2],
                     [3, 4]],
                    [[5, 6],
                     [7, 8]]])
      print(a, a.shape)
      print(a[0])
      print(a[0][0])
      print(a[0][0][0])
      print(a[0, 0, 0])
      for i in range(a.shape[0]):
          for j in range(a.shape[1]):
              for k in range(a.shape[2]):
                  print(a[i, j, k])
      
      
      ##[[[1 2]
      ##  [3 4]]
      
      ## [[5 6]
      ## [7 8]]] (2, 2, 2)
      
      #[[1 2]
      # [3 4]]
      
      #[1 2]
      
      #1
      
      #1
      
      #1
      #2
      #3
      #4
      #5
      #6
      #7
      #8
      
    7. Numpy内部基本数据类型
      布尔型:bool_
      整数型:
        有符号:int8(-128~127)/int16/int32/int64
        无符号:uint8(0~255)/uint16/uint32/uint64
      浮点型:float16/float32/float64
      复数型:complex64/complex128
      字符串型:str_,每个字符用32位Unicode编码表示

    8. 自定义复合类型
      代码:

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      import numpy as np
      a = np.array([('123', [4, 5, 6])],
                   dtype='U3, 3i4')
      print(a[0]['f0'], a[0]['f1'])
      b = np.array([('123', [4, 5, 6])],
                   dtype=[('fa', np.str_, 3),
                          ('fb', np.int32, 3)])
      print(b[0]['fa'], b[0]['fb'])
      c = np.array([('123', [4, 5, 6])],
                   dtype={'names': ['fa', 'fb'],
                          'formats': ['U3', '3i4']})
      print(c[0]['fa'], c[0]['fb'], c.itemsize)
      d = np.array([('123', [4, 5, 6])],
                   dtype={'fa': ('U3', 0),
                          'fb': ('3i4', 16)})
      print(d[0]['fa'], d[0]['fb'], d.itemsize)
      e = np.array([0x1234],
                   dtype=('>u2', {'lo': ('u1', 0),
                                  'hi': ('u1', 1)}))
      print('{:x}'.format(e[0]))
      print('{:x} {:x}'.format(e['lo'][0], e['hi'][0]))
      
      # 123 [4 5 6]
      
      # 123 [4 5 6]
      
      # 123 [4 5 6] 24
      
      # 123 [4 5 6] 28
      
      # 1234
      
      # 12 34
    9. 类型字符码
      np.bool_:?
      np.int8:b
      np.uint8:B
      np.int8/16/32/64:i1/2/4/8
      np.uint8/16/32/64:u1/2/4/8
      np.float/16/32/64: f2/4/8
      np.complex64/128: c8/16
      np.str_: U<字符数>
      np.datetime64: M8
      字节序前缀,用于多字节整数和字符串:
      </>/[=]分别表示小端/大端/硬件字节序。
      <字节序前缀><维度><类型><字节数或字符数>
      >3i4:大端字节序,3个元素的一维数组,每个元素都是整型,每个整型元素占4个字节。
      <(2,3)u8:小端字节序,6个元素2行3列的二维数组,每个元素都是无符号整型,每个无符号整型元素占8个字节。
      >U7: 包含7个字符的Unicode字符串,每个字符占4个字节,采用大端字节序。

    10. 切片
      数组对象[起始位置:终止位置:步长,...]
      缺省起始位置:(位置步长+)首 / (位置步长-)尾
      缺省终止位置:(位置步长+)尾后 / (位置步长)首前
      缺省位置步长:1
      代码:
       

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      import numpy as np
      a = np.arange(1, 10)
      print(a)  # 1 2 3 4 5 6 7 8 9
      print(a[:3])  # 1 2 3
      print(a[3:6])   # 4 5 6
      print(a[6:])  # 7 8 9
      print(a[::-1])  # 9 8 7 6 5 4 3 2 1
      print(a[:-4:-1])  # 9 8 7
      print(a[-4:-7:-1])  # 6 5 4
      print(a[-7::-1])  # 3 2 1
      print(a[::])  # 1 2 3 4 5 6 7 8 9
      print(a[:])  # 1 2 3 4 5 6 7 8 9
      print(a[...])  # 1 2 3 4 5 6 7 8 9
      print(a[::3])  # 1 4 7
      print(a[1::3])  # 2 5 8
      print(a[2::3])  # 3 6 9
      b = np.arange(1, 25).reshape(2, 3, 4)
      print(b)
      print(b[:, 0, 0])  # 1 13
      print(b[0])
      print(b[0, :, :])
      print(b[0, ...])
      print(b[0, 1])  # 5  6  7  8
      print(b[0, 1, ::2])  # 5 7
      print(b[..., 1])
      print(b[:, 1])
      print(b[0, 1, 1::2])  # 6 8
      print(b[0, :, -1])  # 4 8 12
      print(b[0, ::-1, -1])  # 12 8 4
      print(b[0, ::2, -1])  # 4 12
      print(b[::-1, ::-1])
      print(b[..., ::-1])
      print(b[-1, 1:, 2:])
    11. 改变维度
      视图变维 返回一个具有新维度的新数组对象 数据共享   reshape/ravel
      复制变维 返回一个具有新维度的新数组对象 数据独立   flatten
      就地变维 在原数组对象之上,改变其维度,不返回新数组
      xxx.shape = ...
      xxx.resize(...)
      代码
       

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      import numpy as np
      a = np.arange(1, 9)
      print(a) #[1 2 3 4 5 6 7 8]
      b = a.reshape(2, 4)
      print(b) #[[1 2 3 4]
               #[5 6 7 8]]
      c = b.reshape(2, 2, 2)
      print(c)# [[[1 2]
              #  [3 4]]
      
              #  [[5 6]
              #  [7 8]]]
      d = c.ravel()
      print(d)  #[1 2 3 4 5 6 7 8]
      e = c.flatten()
      print(e)  #[1 2 3 4 5 6 7 8]
      a += 10
      print(a, b, c, d, e, sep='\n')
      a.shape = (2, 4)
      print(a)
      a.resize(2, 2, 2)
      print(a) #[[[11 12]
               # [13 14]]
      
               # [[15 16]
               # [17 18]]]
      
      f = b.transpose()
      print('+++++++++++')
      print(f)   #[[11 15]
                 #[12 16]
                 #[13 17]
                 #[14 18]]
      
      a -= 10
      print(f)
    12. 组合与拆分
      垂直:
      np.vstack((上,下)) -> 组合数据
      np.concatenate((上,下)),axis=0)
      axis表示轴向
        二维数组:0-行,垂直,1-列,水平
        三维数组:0-页,深度,1-行,垂直,2-列,水平
      np.vsplit(数组,份数) -> 上,...下
      np.split(数组,份数,axis=0)

      水平
      np.hstack((左,右)) -> 组合数组
      np.concatenate((左,右),axis=1)
      np.hsplit(数组,份数) ->左,...,右
      np.split(数组,份数,axis=1)

      深度
      np.dstack((前,后)) ->组合数据
      np.dsplit(数组,份数) ->前,...,后

      行列(可以用一维数组做参数)
      np.row_stack((上,下)) ->组合数组
      np.column_stack((左,右)) ->组合数组
      代码:
       

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      import numpy as np
      a = np.arange(11, 20).reshape(3, 3)
      print(a)#[[11 12 13]
               #[14 15 16]
               #[17 18 19]]
      
      b = a + 10
      print(b)#[[21 22 23]
               #[24 25 26]
               #[27 28 29]]
      
      c = np.vstack((a, b))
      print(c)   #[[11 12 13]
                  #[14 15 16]
                  #[17 18 19]
                  #[21 22 23]
                  #[24 25 26]
                  #[27 28 29]]
      
      d = np.concatenate((a, b), axis=0)
      print(d)
      e, f = np.vsplit(c, 2)
      
      print(e, f, sep='\n')#[[11 12 13]
                          #  [14 15 16]
                          #  [17 18 19]]
                          # [[21 22 23]
                          #  [24 25 26]
                          #  [27 28 29]]
      
      g, h = np.split(d, 2, axis=0)
      print(g, h, sep='\n')
      i = np.hstack((a, b))
      print(i) # [[11 12 13 21 22 23]
               # [14 15 16 24 25 26]
               # [17 18 19 27 28 29]]
      
      j = np.concatenate((a, b), axis=1)
      print(j) # [[11 12 13 21 22 23]
               # [14 15 16 24 25 26]
               # [17 18 19 27 28 29]]
      k, l = np.hsplit(i, 2)
      print(k, l, sep='\n')   # [[11 12 13]
                              #  [14 15 16]
                              #  [17 18 19]]
                              # [[21 22 23]
                              #  [24 25 26]
                              #  [27 28 29]]
      
      m, n = np.split(i, 2, axis=1)
      print(m, n, sep='\n')
      o = np.dstack((a, b))
      print(o) #  [[[11 21]
               #  [12 22]
               #  [13 23]]
      
               # [[14 24]
               #  [15 25]
               #  [16 26]]
      
               # [[17 27]
               #  [18 28]
               #  [19 29]]]
      
      print('++++++')
      p, q = np.dsplit(o, 2)
      print(p.T[0].T, q.T[0].T, sep='\n')
      a, b = a.ravel(), b.ravel()
      print(a, b) #[11 12 13 14 15 16 17 18 19] [21 22 23 24 25 26 27 28 29]
      #r = np.vstack((a, b))
      r = np.row_stack((a, b))
      print(r) #[[11 12 13 14 15 16 17 18 19]
               #[21 22 23 24 25 26 27 28 29]]
      
      #s = np.hstack((a, b))
      s = np.column_stack((a, b))
      print(s) # [[11 21]
               # [12 22]
               # [13 23]
               # [14 24]
               # [15 25]
               # [16 26]
               # [17 27]
               # [18 28]
               # [19 29]]
    13. ndarray类的属性
      shape - 维度
      dtype - 元素类型
      size - 元素数量
      ndim - 维数,len(shape)
      itemsize - 元素字节数
      nbytes - 总字节数 = size x itemsize
      real - 复数数组的实部数组
      imag - 复数数组的虚部数组
      T - 数组对象的转置视图
      flat - 扁平迭代器
      数组对象.tolist() ->列表
      代码:
       

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      import numpy as np
      a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],
                    [4 + 2j, 5 + 5j, 6 + 8j],
                    [7 + 3j, 8 + 6j, 9 + 9j]])
      print(a.shape) #(3, 3)
      print(a.dtype) #complex128
      print(a.size)  #9
      print(a.ndim)  #2
      print(a.size)  #9
      print(a.itemsize) #16
      print(a.nbytes)   #144
      print(a.real, a.imag, sep='\n') # [[ 1.  2.  3.]
                                      #  [ 4.  5.  6.]
                                      #  [ 7.  8.  9.]]
                                      # [[ 1.  4.  7.]
                                      #  [ 2.  5.  8.]
                                      #  [ 3.  6.  9.]]
      
      print(a.T)
      print([elem for elem in a.flat])
      b = a.tolist()
      print(b)

五.数据可视化

Matplotlib
    |
    |
  Numpy
  Matlab
  1. 基本绘图
    mp.plot(水平坐标,垂直坐标)
    代码:
    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    x = np.linspace(-np.pi, np.pi, 1000)
    cos_y = np.cos(x) / 2
    sin_y = np.sin(x)
    mp.plot(x, cos_y)
    mp.plot(x, sin_y)
    mp.show()
    
  2. 线型,线宽和颜色
    mp.plot(
        ..., linestyle=线型, linewidth=线宽, color=颜色, ...)
    代码:
    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as mp
    x = np.linspace(-np.pi, np.pi, 1000)
    cos_y = np.cos(x) / 2
    sin_y = np.sin(x)
    mp.plot(x, cos_y, linestyle='--', linewidth=1,
            color='red')
    mp.plot(x, sin_y, linestyle=':', linewidth=3,
            color='green')
    mp.show()

猜你喜欢

转载自blog.csdn.net/qq_42584444/article/details/83684146