美文网首页
第一章 预备知识

第一章 预备知识

作者: 陈易男 | 来源:发表于2020-12-14 18:35 被阅读0次

    本节主要学习一些使用pandas所需要的python基础和numpy基础

    一、Python基础

    \color{orange}{1、列表推导式与条件赋值}

    • 列表推导式
      可以使用简介的形式生成列表内容,其形式一般为[func(x) for x in set],同时,列表表达式还支持多层嵌套,一个简单的例子如下
    In : [m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]
    Out: ['a_c', 'a_d', 'b_c', 'b_d']
    

    两个for依次为外循环和内循环

    • 条件赋值
      类似于C语言的条件赋值运算符
    x = True
    y = 1 if x==True else 0
    

    等价于C语言中

    bool x = true
    y = x==true ? 1 : 0
    
    • 列表推导式与条件赋值的综合运用
      截断一个列表中超过5的元素,使用5替代超过5的元素
    In : L = [1, 2, 3, 4, 5, 6, 7]
    In : [i if i <= 5 else 5 for i in L]
    Out: [1, 2, 3, 4, 5, 5, 5]
    
    

    \color{orange}{2、匿名函数与map方法}

    • 匿名函数可以表示一些简单的映射关系
      如使用匿名函数编写一个函数表示映射关系f(x)=sin(x)+e^x
    import math
    func = lambda x: math.sin(x)+math.exp(x)
    
    • map方法
      map可以实现对一个对象实施一种映射操作并返回一个map对象,可以通过list转换
    In : list(map(lambda x: 2*x, range(5)))
    Out: [0, 2, 4, 6, 8]
    

    \color{orange}{3、zip对象与enumerate方法}

    • zip对象
      将多个可迭代对象打包成一个元组构成的可迭代对象,返回一个zip对象
    In : L1, L2, L3 = list('abc'), list('def'), list('hij')
    In : list(zip(L1, L2, L3))
    Out: [('a', 'd', 'h'), ('b', 'e', 'i'), ('c', 'f', 'j')]
    

    可以使用*将zip的对象解压

    In : zipped = list(zip(L1, L2, L3))
    In : list(zip(*zipped)) # 三个元组分别对应原来的列表
    Out: [('a', 'b', 'c'), ('d', 'e', 'f'), ('h', 'i', 'j')]
    
    • enumerate
      是一种特殊的打包,它可以在迭代时绑定迭代元素的遍历序号

    二、Numpy基础

    \color{orange}{1、numpy数组的构造}

    通常使用np.array来构造np数组

    In: import numpy as np
    In: np.array([1,2,3])
    Out: array([1,2,3])
    
    • 还存在一些特殊的数组生成方式

    np.linsapce,np.arange用于生成等差序列
    np.zeros,np.eye,np.full用于生成特殊矩阵
    np.random用于生成随机矩阵

    \color{orange}{2、numpy数组的变形与合并}

    • 变形操作
      转置 .T
      合并 np.r_, np.c_,用于行合并和列合并
    • 变形
      reshape

    \color{orange}{3、numpy数组的切片与索引}

    可以使用slice类型切片,还可以使用bool类型索引

    \color{orange}{4、常用函数}

    • where:一种条件函数,可以指定满足条件与不满足条件位置对应的填充值
    • nonzero, argmax, argmin:这三个函数返回的都是索引, nonzero 返回非零数的索引, argmax, argmin 分别返回最大和最小数的索引
    • any,all:any 指当序列至少 存在一个 True 或非零元素时返回 True ,否则返回 False; all 指当序列元素 全为 True 或非零元素时返回 True ,否则返回 False
    • cumprod, cymsum, diff: cumprod , cumsum分别表示累乘和累加函数,返回同长度的数组, diff 表示和前一个元素做差,由于第一个元素为缺失值,因此在默认参数情况下,返回长度是原数组减1
    • 统计函数:常用的统计函数包括 max, min, mean, median, std, var, sum, quantile ,其中分位数计算是全局方法,因此不能通过 array.quantile 的方法调用。协方差计算函数为cov,相关系数计算函数为corrcoef

    \color{orange}{5、广播机制}

    用于处理两个不同维度数组之间的操作

    • 标量和数组之间的操作
      标量会自动把大小扩充为数组大小,然后逐个元素操作
    • 二维数组之间的操作
      当两个数组维度完全一致时,使用对应元素的操作,否则会报错,除非其中的某个数组的维度是 m×1 或者 1×n ,那么会扩充其具有 1 的维度为另一个数组对应维度的大小。
    • 一维数组与二位数组之间的操作
      当一维数组 A_k 与二维数组 B_{m,n} 操作时,等价于把一维数组视作A_{1,k} 的二维数组,使用的广播法则与二维数组之间的操作一致,当 k!=nk,n都不是 1 时报错。

    \color{orange}{5、向量与矩阵的计算}

    • 内积 dot
    • 向量范数和矩阵范数 np.linalg.normord参数的可选值如下图
      ord参数的可选值
    • 矩阵乘法 @

    三、练习

    \color{Blue}{1、利用列表推导式写矩阵乘法}

    Ex1
    我的解答
    M1 = np.random.rand(2,3)
    M2 = np.random.rand(3,4)
    res = np.empty((M1.shape[0],M2.shape[1]))
    res = [[sum([M1[i][k]*M2[k][j] for k in range(M1.shape[1])]) for j in range(M2.shape[1])] for i in range(M1.shape[0])]
    ((M1@M2 - res) < 1e-15).all() # 排除数值误差
    
    Ex1 result

    \color{Blue}{2、更新矩阵}

    Ex2
    我的解答
    def update_func(A:np.array)->np.array:
        _A = np.sum(1 / A, axis=1).reshape(-1,1)
        B = A * _A
        return B
    A = np.array([[1,2,3],
                 [4,5,6],
                 [7,8,9]])
    B = update_func(A)
    print(B)
    
    Ex2 result

    \color{Blue}{3、卡方统计量}

    Ex3
    我的解答
    np.random.seed(0)
    A = np.random.randint(10, 20, (8, 5))
    def calc_chi_square(A:np.array)->np.array:
        B = np.sum(A,axis=1).reshape(-1,1)*np.sum(A,axis=0).reshape(1,-1) / np.sum(A)
        return np.sum(np.power(A-B,2)/B)
    calc_chi_square(A)
    
    Ex3 result

    \color{Blue}{4、改进矩阵计算的性能}

    Ex4
    我的解答
    本题主要是矩阵的转换,结果参考了参考答案
    参考答案
    def my_solution(B, U, Z):
         return (((B**2).sum(1).reshape(-1,1) + (U**2).sum(0) - 2*B@U)*Z).sum()
    my_solution(B,U,Z)
    
    性能改进程度

    \color{Blue}{5、连续整数的最大长度}

    Ex5
    我的解答
    def find_max(x: np.array)->np.array:
        diff_x = np.r_[1,np.diff(x)!=1,1]
        return np.diff(np.nonzero(diff_x)).max()
    x = [3,2,1,2,3,4,6]
    find_max(x)
    
    Ex5 result

    相关文章

      网友评论

          本文标题:第一章 预备知识

          本文链接:https://www.haomeiwen.com/subject/pymugktx.html