python数据结构

n维数组ndarray

  1. python中的数组

    1. 形式
      1. listtuple等序列数据结构结构表示的数组
      2. array模块 (非内置模块 不支持多维)
        • 通过array函数创建数组 ,array.array('B',range(5))
        • 提供append insert read等方法
  2. ndarray

    • 特点

      • N维数组
      • NumPy中基本的数据结构
      • 所有元素是同一种类型 不像列表那样包含多类但存大量指针和空间
      • 别名为array
      • 利于节省内存和提高CPU计算时间
      • 有丰富的函数
    • 基本概念

      • 维度 成为轴 轴的个数称为秩
      • 基本属性
        • ndarray.ndim
        • ndiarray.shape 维度
        • ndarray.size 元素总个数
        • ndarray.dtype 元素类型
        • ndarray.itemsize 元素字节大小
    • 创建与使用

      import numpy as np
      
      aArray=np.array([1,2,3])
      
      aArray
      Out[3]: array([1, 2, 3])
      
      bArray=np.array([(1,2,3),(4,5,6)])
      
      bArray
      Out[5]: 
      array([[1, 2, 3],
             [4, 5, 6]])
      
      np.arange(1,5,0.6)
      Out[7]: array([1. , 1.6, 2.2, 2.8, 3.4, 4. , 4.6])
      
      np.random.random((2,2))
      Out[8]: 
      array([[0.52820866, 0.42113216],
             [0.48049641, 0.5325641 ]])
      
      np.linspace(1,2,10,endpoint=False)
      Out[9]: array([1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9])
      
      np.ones([2,3])
      Out[10]: 
      array([[1., 1., 1.],
             [1., 1., 1.]])
      
      np.zeros([2,3])
      Out[11]: 
      array([[0., 0., 0.],
             [0., 0., 0.]])
      
      np.fromfunction(lambda i,j:(i+1)*(j+1),(9,9))
      Out[12]: 
      array([[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.],
             [ 2.,  4.,  6.,  8., 10., 12., 14., 16., 18.],
             [ 3.,  6.,  9., 12., 15., 18., 21., 24., 27.],
             [ 4.,  8., 12., 16., 20., 24., 28., 32., 36.],
             [ 5., 10., 15., 20., 25., 30., 35., 40., 45.],
             [ 6., 12., 18., 24., 30., 36., 42., 48., 54.],
             [ 7., 14., 21., 28., 35., 42., 49., 56., 63.],
             [ 8., 16., 24., 32., 40., 48., 56., 64., 72.],
             [ 9., 18., 27., 36., 45., 54., 63., 72., 81.]])
      
      x=np.fromfunction(lambda i,j:(i+1)*(j+1),(9,9))
      
      x.ndim
      Out[14]: 2
      
      x.shape
      Out[15]: (9, 9)
      
      x.size
      Out[16]: 81
      
      bArray
      Out[18]: 
      array([[1, 2, 3],
             [4, 5, 6]])
      
      print(bArray[1])
      [4 5 6]
      
      print(bArray[0:2])  #切片 选择0和1行
      [[1 2 3]
       [4 5 6]]
      
      print(bArray[:,[0,1]]) #选择第0和1列
      [[1 2]
       [4 5]]
      
      print(bArray[1,[0,1]])  #选择第1行 第0和1列
      [4 5]
      
      for row in bArray:
          print(row)
          
      [1 2 3]
      [4 5 6]
      
      print(bArray.reshape(3,2))  #原多维数组不改变
      [[1 2]
       [3 4]
       [5 6]]
      
      bArray.resize(3,2)   #改变多维数组本身
      
      bArray
      Out[27]: 
      array([[1, 2],
             [3, 4],
             [5, 6]])
      
      bArray=np.array([1,2,3])
      
      cArray=np.array([4,5,6])
      
      np.vstack((bArray,cArray))   #在垂直方向拼接
      Out[30]: 
      array([[1, 2, 3],
             [4, 5, 6]])
      
      np.hstack((bArray,cArray))         #在水平方向拼接
      Out[31]: array([1, 2, 3, 4, 5, 6])
      
    • ndarray的运算

      aArray=np.array([(5,5,5),(2,2,2)])
      
      bArray=np.array([(5,5,5),(1,2,3)])
      
      cArray=aArray*bArray
      cArray
      Out[36]: 
      array([[25, 25, 25],
             [ 2,  4,  6]])
      
      aArray+=bArray
      
      aArray
      Out[38]: 
      array([[10, 10, 10],
             [ 3,  4,  5]])
      a=np.array([1,2,3])
      
      b=np.array([[1,2,3],[4,5,6]])
      
      a+b  #广播
      Out[42]: 
      array([[2, 4, 6],
             [5, 7, 9]])
      
      b.sum()
      Out[45]: 21
      
      b.sum(axis=0)
      Out[46]: array([5, 7, 9])
      
      b.sum(axis=1)
      Out[47]: array([ 6, 15])
      
      b.mean() #平均值
      Out[48]: 3.5
      
      b.var() #方差
      Out[49]: 2.9166666666666665
      
      b.std()  #标准差
      Out[50]: 1.707825127659933
      
    • ndarray的专门应用 - 线性代数

      • dot矩阵内积 linalg.det行列式 linalg.inv逆矩阵 linalg.solve多元一次方程求根 linalg.eig求特征值和特征向量

        import numpy as np
        x=np.array([[1,2],[3,4]])
        
        r1=np.linalg.det(x)
        
        r1
        Out[53]: -2.0000000000000004
        
        r2=np.linalg.inv(x)
        
        r2
        Out[55]: 
        array([[-2. ,  1. ],
               [ 1.5, -0.5]])
        
        r3=np.dot(x,x)
        
        r3
        Out[57]: 
        array([[ 7, 10],
               [15, 22]])
        
    • ndarrayufunc函数

      • 一种可以对数组的每个元素进行操作的函数 很多是基于C语言级别实现 计算速度很快

变长字典 Series

  • 基本特征

    • 类似一位数组的对象

    • 由数据和索引(自带)组成

      import pandas as pd
      from pandas import Series
      aSer=pd.Series([1,2.3,'a'])
      aSer
      
      Out[3]: 
      0      1
      1    2.3
      2      a
      dtype: object
      
    • 自定义Seriesindex

      bSer=pd.Series(['apple','peach','lemon'],index=[1,2,3])
      
      bSer
      Out[5]: 
      1    apple
      2    peach
      3    lemon
      dtype: object
      
      bSer.index
      Out[6]: Int64Index([1, 2, 3], dtype='int64')
      
      bSer.values
      Out[7]: array(['apple', 'peach', 'lemon'], dtype=object)
      
    • Series的基本运算

      aSer=Series([3,5,7],index=[1,2,3])
      
      aSer[2]
      Out[11]: 5
      
      aSer**2
      Out[12]: 
      1     9
      2    25
      3    49
      dtype: int64
      
      import numpy as np
      
      np.exp(aSer)
      Out[14]: 
      1      20.085537
      2     148.413159
      3    1096.633158
      dtype: float64
      
    • Series的数据对齐 在算术运算中会自动对齐不同索引的数据

      data={'axp':'23.2','csco':'122','ba':'99'}
      
      sindex=['axp','csco','ba','apple']
      
      aSer=pd.Series(data,index=sindex)
      
      aSer
      Out[29]: 
      axp      23.2
      csco      122
      ba         99
      apple     NaN
      dtype: object
      
      pd.isnull(aSer)
      Out[30]: 
      axp      False
      csco     False
      ba       False
      apple     True
      dtype: bool
      
    • Seriesname属性

      • Series对象本身 索引均有一个name属性

      • Seriesname属性与其重要功能关系密切

        aSer.name='cnames'
        
        aSer.index.name='volume'
        
        aSer
        Out[53]: 
        volume
        axp        3
        csco     122
        ba        99
        apple    NaN
        Name: cnames, dtype: object
        

数据表 DataFrame

  • 基本特征

    • 一个表格型的数据结构
    • 含有一组有序的列(类似于index
    • 大致可以看成共享同一个indexSeries集合
  • 创建与使用

    data={'name':['peter','marry','bush'],'pay':[6000,7000,8000]}
    
    frame=pd.DataFrame(data)
    
    frame
    Out[57]: 
        name   pay
    0  peter  6000
    1  marry  7000
    2   bush  8000
    
    
    data=np.array([('peter',6000),('marry',7000),('bush',8000)])
    
    frame=pd.DataFrame(data,index=range(1,4),columns=['name','pay'])
    
    frame
    Out[62]: 
        name   pay
    1  peter  6000
    2  marry  7000
    3   bush  8000
    
    frame.index
    Out[63]: RangeIndex(start=1, stop=4, step=1)
    
    frame.columns
    Out[64]: Index(['name', 'pay'], dtype='object')
    
    frame.values
    Out[65]: 
    array([['peter', '6000'],
           ['marry', '7000'],
           ['bush', '8000']], dtype=object)
    
  • 基本操作

    • DataFrame对象的列和行 区间值
    n [66]: frame['name']
    Out[66]: 
    1    peter
    2    marry
    3     bush
    Name: name, dtype: object
    
    frame.pay
    Out[67]: 
    1    6000
    2    7000
    3    8000
    Name: pay, dtype: object
    
    frame.iloc[:2,1]  #二维操作 行列[n:m,a:b] n行到m行的a列到b列
    Out[68]: 
    1    6000
    2    7000
    Name: pay, dtype: object
    
    frame.iloc[1:2,1]
    Out[69]: 
    2    7000
    Name: pay, dtype: object
    
    frame.iloc[1:2,0:2]
    Out[70]: 
        name   pay
    2  marry  7000
    
    • DataFrame对象的修改删除

    • DataFrame的统计功能

      frame.pay.min()
      Out[76]: '6000'
      
      frame[frame.pay>='5000']
      Out[77]: 
      person   name   pay
      1       peter  6000
      2       marry  7000
      3        bush  8000
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值