数分-工具-Pandas1-预备知识
(AI算法系列)
文章目录
1知识点
- Python基础
- 列表推导与条件赋值
- 匿名函数与map
- zip与enumerate
- Numpy基础
- 构造
- 变形与合并
- 切片、索引
- 常用函数
- 广播机制
- 向量与矩阵计算
- 练习
2具体内容
2.1Python基础
2.1.1列表推导与条件赋值
1.列表推导式
xxx for i in yyy
#xxx为映射函数,其输入为后面 i 指代的内容
#yyy表示迭代的对象
2.多层嵌套
xxx for m in yyy for n in zzz
#第一个for为外层循环
3.if条件赋值
value = a if xxx else b
2.1.2匿名函数与map
my_func = lambda x:2*x
multi_para_func = lambda a,b :a+b
[(lambda x:2*x)(i) for i in range(5)]
#等价于
list(map(lambda x:2*x, range(5)))
list(map(lambda x, y: str(x)+'_'+y, range(5), list('abcde')))
2.1.3zip与enumerate
- zip函数能够把多个可迭代对象打包成一个元组构成的可迭代对象,它返回了一个 zip 对象,通过 tuple, list 可以得到相应的打包结果
L1, L2, L3 = list('abc'), list('def'), list('hij')
for i, j, k in zip(L1, L2, L3):
print(i, j, k)
- enumerate 是一种特殊的打包,它可以在迭代时绑定迭代元素的遍历序号
L = list('abcd')
for idx,val in enumerate(L):
print(idx, val)
#等价于:
for idx,val in zip(range(len(L)),L):
print(idx, val)
- 两个列表建立映射:
dict(zip(L1,L2))
- *、zip 联合解压
zipped = list(zip(L1,L2,L3))
list(zip(*zipped))
#[('a', 'b', 'c'), ('d', 'e', 'f'), ('h', 'i', 'j')]
2.2Numpy基础
2.2.1构造
import numpy as np
np.array([1,2,3])
- 等差序列:np.linspace, np.arange
- 全0阵np.zeros,单位矩阵np.eyes,矩阵填充np.full
- 随机矩阵np.random.【rand0-1均匀分布的随机数组, randn标准正态的随机数组, randint随机整数组, choice随机列表抽样】
- 均匀分布
(b - a) * np.random.rand(3) + a
- 0-1标准正太分布
np.random.randn(2, 2)
- 一元正太分布
mu + np.random.randn(3) * sigma
- 随机整数最小最大及维度
np.random.randint(low, high, size)
- choice默认均匀采样,抽取又放回抽样
np.random.choice(my_list, 2, replace=False, p=[0.1, 0.7, 0.1 ,0.1])
- 当返回的元素个数与原列表相同时,等价于使用 permutation 函数,即打散原列表
np.random.permutation(my_list)
- 随机种子,固定随机数的输出结果
- 均匀分布
np.random.seed(0)
np.random.rand()
2.2.2变形与合并
- 转置T
- 合并r_(上下),c_(左右)
- 维度变换:reshape能够帮助用户把原数组按新的维度重新排列,C逐行填充,F逐列填充
- 被调用数组的大小是确定的,reshape 允许有一个维度存在空缺,此时只需填充-1
a.reshape(-1)
将 n*1 大小的数组转为 1 维数组
2.2.3切片、索引
- slice 类型的 start🔚step 切片,还可以直接传入列表指定某个维度的索引
- 利用 np.ix_(行) 在对应的维度上使用布尔索引,但此时不能使用 slice 切片
- 数组1维,直接布尔索引,不用np.ix_
2.2.4常用函数
- where 条件函数
- nonzero, argmax, argmin 返回索引
- any 序列至少 存在一个 True 或非零元素时返回 True ,否则返回 False
- all 序列元素 全为 True 或非零元素时返回 True ,否则返回 False
- cumprod, cumsum 分别表示累乘和累加函数,返回同长度的数组
- diff 表示和前一个元素做差,由于第一个元素为缺失值,因此在默认参数情况下,返回长度是原数组减 1
- 统计函数: max, min, mean, median, std, var, sum, quantile ,其中分位数计算是全局方法,因此不能通过 array.quantile 的方法调用(np.quantile(target, 0.5))
- 对于含有缺失值的数组,对应的 nan* 函数
- cov协方差,corrcoef相关系数
- 注意:axis=0 时结果为列的统计指标,当 axis=1 时结果为行的统计指标
2.2.5广播机制
- 标量和数组:标量会自动把大小扩充为数组大小,之后进行逐元素操作
- 二维数组之间:当两个数组维度完全一致时,使用对应元素的操作,否则会报错,除非其中的某个数组的维度是 m×1 或者1 × n ,那么会扩充其具有 1 的维度为另一个数组对应维度的大小
- 一维数组与二维数组:当一维数组 A k A_k Ak 与二维数组 B m , n B_{m,n} Bm,n 操作时,等价于把一维数组视作 A 1 , k A_{1,k} A1,k的二维数组,使用的广播法则与上条中一致,当 k! = n 且 k,n 都不是 1 时报错
2.2.6向量与矩阵计算
- 内积dot
- 向量范数和矩阵范数:np.linalg.norm
- 矩阵乘法:@
2.3练习
- 列表推导式
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])]
np.abs((M1@M2 - res) < 1e-15).all()
- 更新矩阵
A= np.arange(1,10).reshape(3,3)
B = A*(1/A).sum(1)#按行相加
- 卡方统计量
A = np.random.randint(10, 20, (8, 5))
A.sum()#全部元素和,一个值
B = A.sum(0)* A.sum(1).reshape(-1,1)/ A.sum()#reshape为一列
C = ((A - B) ** 2/B).sum()
- 改进矩阵计算
向量差的平方,用平方差公式展开
(((B ** 2).sum(1).reshape(-1,1) + (U ** 2).sum(0) - 2*B@U)*Z).sum()
# B是 m × p,按行加出p列 ,U是 p × n,按列加出p行,再运算
- 连续整数最大长度
lambda x:np.diff(np.nonzero(np.r_[1,np.diff(x)!=1,1])).max()
3待补充
- Numpy矩阵运算
- Numpy常用函数,需要再熟练
4Q&A
无
5code
无
6参考
- http://joyfulpandas.datawhale.club/Content/ch1.html#