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

第一章 预备知识

作者: 陈易男 | 来源:发表于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

相关文章

  • C++语言学习目录

    第一章 预备知识1.1 C++简介1.2 C++简史1.3 可移植性和标准

  • 【 数据结构 & 算法 】—— 二叉树、图

    思维导图 预备知识:二叉树定义(★) 预备知识_二叉树定义.cpp 预备知识:二叉树的深度遍历(★) 预备知识_二...

  • 第一章 预备知识

    1.1 C++ 简介 C++融合了三种不同的编程方式:C 语言代表的过程性语言、添加到面向对象语言、C++ 模板支...

  • 第一章 预备知识

    本节主要学习一些使用pandas所需要的python基础和numpy基础 一、Python基础 列表推导式可以使用...

  • 第一章 预备知识

    (简述) c++融合了三种不同的编程方式:c语言代表的过程性语言、c++在c语言基础上添加的类代表的面向对象的语言...

  • 预备知识

    M3内核基本结构 Cortex-M3内核是32位的 M3F103内核采用Thumb-2指令集 支持16/32位指令...

  • 预备知识

    数据仓库定义 数据仓库的基本概念 面向主题的、集成的、非易失的、反应历史变化的,数据集合,用于支持管理决策。 数据...

  • 预备知识

    定义一个结构体,包括邻接结点和边权值,用来表示一条边 用vector表示结点 清空 添加 删除

  • 【 数据结构 & 算法 】—— 栈、队列、堆

    < 思维导图 > 预备知识:STL stack(堆) 预备知识:STL queue(队列) 使用队列实现栈(栈、队...

  • jsmpeg系列二 基础知识 TS码流 PAT PMT

    参考【PSI/SI学习系列】第一章:预备知识【PSI/SI学习系列】第二章:从TS到PAT和PMT 最近开始学习数...

网友评论

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

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