一、python基础
1. 列表推导式和匿名函数
在生成一个数字序列的时候,在Python中可以如下写出:
但是这样的方式过于复杂,因此可以利用列表推导式简化写法。
(1)[ * for i in * ] 这个就是列表推导式写法, 第一个* 表示映射函数,函数中的 i 为后面的 i 指代的内容,第二个 * 表示迭代对象所以上述生成数字序列的过程又可以用以下简化写法
(2)定义一个函数的过程,在代码量庞大的时候显得累赘,不利于代码的可读性,所以当一个函数只在此过程使用,其他地方不用调用的时候,可以使用匿名函数,省去定义的过程,既简洁,又可读,且节省时间。
(3)对于上述的这种列表推导式的匿名函数映射,Python中提供了map函数来完成,它返回的是一个map对象,需要通过list转为列表:
注意:对于多个输入值的函数映射,可以通过追加迭代对象实现:
【补充】
① 列表表达式还支持多层嵌套,如下面的例子中第一个for为外层循环,第二个为内层循环:
②语法糖:带有if选择的条件赋值,其形式为value=a if condition else b:
条件赋值结合列表推导式生成列表
2. zip对象与enumerate方法
2.1 zip函数
zip函数能够把多个可迭代对象打包成一个元组构成的可迭代对象,它返回了一个zip对象,通过tuple,list可以得到相应的打包结果:
2.2 enumerate函数
enumerate是一种特殊的打包,它可以在迭代时绑定迭代元素的遍历序号:
当需要对两个列表建立字典映射时,可以利用zip对象:
dict函数将zip中的第一个列表元素作为字典的键,第二个列表元素作为字典的值
2.3 解压缩函数
二、numpy基础
1.np数组的构造
(1) 基于array构造
(2)等差序列:np.linspace,np.arange
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
在指定的间隔内返回均匀间隔的数字。返回num均匀分布的样本,在[start, stop]。
np.arange([start, ]stop, [step, ]dtype=None)start:可忽略不写,默认从0开始;起始值
stop:结束值;生成的元素不包括结束值
step:可忽略不写,默认步长为1;步长
(3)特殊矩阵zeros,eye,full
(4)随机矩阵:np.random
最常用的随机生成函数为rand,randn,randint,choice,它们分别表示0-1均匀分布的随机数组、标准正态的随机数组、随机整数组和随机列表抽样:
## np.random.rand —— 生成随机数数组
## np.random.randn —— 生成满足N(0,1)之间的标准正态分布的数组
## np.random.randint—— 生成随机整数
numpy.random.randint(low, high=None, size=None, dtype='l')
2) 生成一维整数数组
3) 生成多维数组
## np.random.choice —— 从给定的列表中以一定的方式和概率抽取结果
2. numpy数组的变形与合并
2.1 转置 T
2.2 合并 r_ , c_对于二维数组, r_ 和 c_ 分别表示上下合并和左右合并:
r_ : rows的首字母,表示在行上进行相加
c_ : columns的首字母,表示在列上进行相加
2.3 维度变换 reshape
3. 数组索引方法1:slice,[start,end,step]
方法2:直接传入列表指定维度的索引
此外,还可以利用 np.ix_ 在对应的维度上使用布尔索引,但此时不能使用 slice 切片
4. 常用函数
为了简单起见,这里假设下述函数输入的数组都是一维的。
4.1 where
where 是一种条件函数,可以指定满足条件与不满足条件位置对应的填充值
4.2 nonzero,argmax,argmin
3个函数均返回索引,nonzero返回非0元素索引值,argmax和argmin返回最大和最小值对应的索引
4.3 any,all
# any(x) 判断x中是否有一个非零,非空对象,则返回 True ,否则返回 False
#all(x) x中所有元素全为 True 或非零元素时返回 True ,否则返回 False
4.4 cumprod,cumsum,diff
# cumprod, cumsum 分别表示累乘和累加函数,返回同长度的数组,
# diff 表示和前一个元素做差,由于第一个元素为缺失值,因此在默认参数情况下,返回长度是原数组减1
# cumulative:累计的,累加的
4.5 统计函数
常用的统计函数包括 max, min, mean, median, std, var, sum, quantile ,其中分位数计算是全局方法,因此不能通过 array.quantile 的方法调用:
但是对于含有缺失值的数组,它们返回的结果也是缺失值,如果需要略过缺失值,必须使用 nan* 类型的函数,上述的几个统计函数都有对应的 nan* 函数。对于协方差和相关系数分别可以利用 cov, corrcoef 如下计算:最后,需要说明二维 Numpy 数组中统计函数的 axis 参数,它能够进行某一个维度下的统计特征计算,
当 axis=0 时结果为列的统计指标,当 axis=1 时结果为行的统计指标:
5. 广播机制
广播机制用于处理两个不同维度数组之间的操作,这里只讨论不超过两维的数组广播机制
5.1 标量和数组的操作
当一个标量和数组进行运算时,标量会自动把大小扩充为数组大小,之后进行逐元素操作:
5.2 二维数组之间的操作
1) 两个数组维度完全一致
2) 两个数组维度不一致,且其中有一个数组为mx1 或者1xn,则会将具有1 的维度扩充为另一个数组对应的维度
5.3 一维数组和二维数组之间的操作
6. 向量和矩阵
6.1 dot()运算
1) 单个数dot运算
2)两个一维数组dot运算
3)两个二维数组dot运算
6.2 @ 矩阵乘法
6.3 向量范数和矩阵范数 np.linalg.norm
# 向量范数:向量大小的度量方式,有L0,L1,L2等不同的计算方式,常用L2范数向量的1-范数:各个元素的绝对值之和
向量的2-范数:每个元素的平方和再开平方根
向量的无穷范数:正无穷范数表示向量的所有元素的绝对值中最大值,负无穷范数表示向量的所有元素的绝对值中最小
p-范数:向量元素绝对值的p次方和的1/p次幂
# 矩阵范数:对向量范数进行推广,就获得了矩阵范数,因此矩阵范数也是对矩阵的一种度量方式矩阵的1-范数(列模):矩阵的每一列上的元素绝对值先求和,再从中取个最大的
矩阵的2-范数(谱模):矩阵和其转置矩阵相乘的最大特征值开平方根
矩阵的无穷范数(行模):矩阵的每一行上的元素绝对值先求和,再从中取个最大的
F-范数:Frobenius范数,即矩阵元素绝对值的平方和再开平方
python用np.linalg.norm实现范数求解
np.linalg.norm(x, ord=None, axis=None, keepdims=False)-x: 表示矩阵(也可以是一维)
-ord:范数类型(默认ord=2 l2范数; ord=1 l1范数; ord=np.inf 无穷范数)
向量的范数求解
矩阵的范数求解
三、练习
Ex1:利用列表推导式写矩阵乘法
numpy.empty(shape, dtype=float, order=‘C’)根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化。