第一章 预备知识
2020-12-14 本文已影响0人
陈易男
本节主要学习一些使用pandas所需要的python基础和numpy基础
一、Python基础
- 列表推导式
可以使用简介的形式生成列表内容,其形式一般为[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]
- 匿名函数
可以表示一些简单的映射关系
如使用匿名函数编写一个函数表示映射关系
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]
- 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基础
通常使用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
用于生成随机矩阵
- 变形操作
转置 .T
合并 np.r_, np.c_,用于行合并和列合并
- 变形
reshape
可以使用slice
类型切片,还可以使用bool
类型索引
-
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
用于处理两个不同维度数组之间的操作
- 标量和数组之间的操作
标量会自动把大小扩充为数组大小,然后逐个元素操作 - 二维数组之间的操作
当两个数组维度完全一致时,使用对应元素的操作,否则会报错,除非其中的某个数组的维度是 或者 ,那么会扩充其具有 1 的维度为另一个数组对应维度的大小。 - 一维数组与二位数组之间的操作
当一维数组 与二维数组 操作时,等价于把一维数组视作 的二维数组,使用的广播法则与二维数组之间的操作一致,当 且 都不是 1 时报错。
- 内积
dot
- 向量范数和矩阵范数
np.linalg.norm
,ord
参数的可选值如下图
ord参数的可选值 - 矩阵乘法
@
三、练习
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
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
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
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)
性能改进程度
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