一.Python基础
1. 列表推导式与条件赋值
def my_func(x):
return 2*x
[my_func(i) for i in range(5)]
列表表达式还支持多层嵌套,如下面的例子中第一个for为外层循环,第二个为内层循环:
[m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]
除了列表推导式,另一个实用的语法糖是带有if选择的条件赋值,其形式为value = a if condition else b:
L = [1, 2, 3, 4, 5, 6, 7]
[i if i <= 5 else 5 for i in L]
2. 匿名函数与map方法
列表推导式的匿名函数映射,Python中提供了map函数来完成,它返回的是一个map对象,需要通过list转为列表:
list(map(lambda x: 2*x, range(5)))
对于多个输入值的函数映射,可以通过追加迭代对象实现:
list(map(lambda x, y: str(x)+'_'+y, range(5), list('abcde')))
3. zip对象与enumerate方法
zip函数能够把多个可迭代对象打包成一个元组构成的可迭代对象,它返回了一个zip对象,通过tuple, list可以得到相应的打包结果:
L1, L2, L3 = list('abc'), list('def'), list('hij')
list(zip(L1, L2, L3))
for i, j, k in zip(L1, L2, L3):
print(i, j, k)
enumerate是一种特殊的打包,它可以在迭代时绑定迭代元素的遍历序号:
L = list('abcd')
for index, value in enumerate(L):
print(index, value)
二、Numpy基础
1. np数组的构造¶
最一般的方法是通过array来构造:
import numpy as np
np.array([1,2,3])
【a】等差序列:np.linspace, np.arange
np.linspace(1,5,11) # 起始、终止(包含)、样本个数
np.arange(1,5,2) # 起始、终止(不包含)、步长
【b】特殊矩阵:zeros, eye, full
np.zeros((2,3)) # 传入元组表示各维度大小
np.eye(3) # 3*3的单位矩阵
np.full((2,3), 10) # 元组传入大小,10表示填充数值
【c】随机矩阵:np.random
最常用的随机生成函数为rand, randn, randint, choice,它们分别表示0-1均匀分布的随机数组、标准正态的随机数组、随机整数组和随机列表抽样:
np.random.rand(3, 3) # 注意这里传入的不是元组,每个维度大小分开输入
randint可以指定生成随机整数的最小值最大值(不包含)和维度大小:
low, high, size = 5, 15, (2,2) # 生成5到14的随机整数
np.random.randint(low, high, size)
choice可以从给定的列表中,以一定概率和方式抽取结果,当不指定概率时为均匀采样,默认抽取方式为有放回抽样:
my_list = ['a', 'b', 'c', 'd']
np.random.choice(my_list, 2, replace=False, p=[0.1, 0.7, 0.1 ,0.1])
最后,需要提到的是随机种子,它能够固定随机数的输出结果:
2. np数组的变形与合并
【a】转置:T
np.zeros((2,3)).T
【b】合并操作:r_, c_
对于二维数组而言,r_和c_分别表示上下合并和左右合并:
np.r_[np.zeros((2,3)),np.zeros((2,3))]
np.c_[np.zeros((2,3)),np.zeros((2,3))]
【c】维度变换:reshape
target = np.arange(8).reshape(2,4)
target
3. np数组的切片与索引
数组的切片模式支持使用slice类型的start🔚step切片,还可以直接传入列表指定某个维度的索引进行切片:
target = np.arange(9).reshape(3,3)
target
target[:-1, [0,2]]
取前面的行(不包括最后一行),取第0列和第2列
4. 常用函数
【a】where
where是一种条件函数,可以指定满足条件与不满足条件位置对应的填充值:
a = np.array([-1,1,-1,0])
np.where(a>0, a, 5) # 对应位置为True时填充a对应元素,否则填充5
【b】nonzero, argmax, argmin
这三个函数返回的都是索引,nonzero返回非零数的索引,argmax, argmin分别返回最大和最小数的索引:
a = np.array([-2,-5,0,1,3,-1])
np.nonzero(a)
a.argmax() # 4
a.argmin() # 1
【c】any, all
any指当序列至少 存在一个 True或非零元素时返回True,否则返回False
all指当序列元素 全为 True或非零元素时返回True,否则返回False
a = np.array([0,1])
a.any() # True
a.all() # False
【d】cumprod, cumsum, diff
cumprod, cumsum分别表示累乘和累加函数,返回同长度的数组,diff表示和前一个元素做差,由于第一个元素为缺失值,因此在默认参数情况下,返回长度是原数组减1
a = np.array([1,2,3])
a.cumprod()
a.cumsum()
np.diff(a)
【e】 统计函数
常用的统计函数包括max, min, mean, median, std, var, sum, quantile,其中分位数计算是全局方法,因此不能通过array.quantile的方法调用
5. 广播机制
【a】标量和数组的操作
当一个标量和数组进行运算时,标量会自动把大小扩充为数组大小,之后进行逐元素操作:
res = 3 * np.ones((2,2)) + 1
res
【b】二维数组之间的操作
res = np.ones((3,2))
res
res * np.array([[2,3]]) # 扩充第一维度为3
6. 向量与矩阵的计算
【a】向量内积:dot
a = np.array([1,2,3])
b = np.array([1,3,5])
a.dot(b)
【b】矩阵乘法:@
a = np.arange(4).reshape(-1,2)
a
b = np.arange(-4,0).reshape(-1,2)
b
a@b