一、python基础
语法糖一、列表推导
L=[] #[]是list格式
def my_func(x):
return 2*x #定义函数
for i in range(5):
L.append(my_func(i))
L
[my_func(i) for i in range(5)] #语法糖——列表推导式,也可以直接写函数,并支持双层嵌套
[m*n for m in range(2) for n in range(3)] #range(8)整数列表,包含从0到7; [m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]
语法糖二、条件复制
value = a if condition else b
value = 'cat' if 2>1 else 'dog'
value
Out[2]: 'cat'
等价如下:
a, b = 'cat', 'dog'
condition = 2 > 1 # 此时为True
if condition:
value = a
else:
value = b
value
L = [1, 2, 3, 4, 5, 6, 7]
[i if i <= 5 else 5 for i in L]
语法糖三、匿名函数
lambda arg1,arg2,arg3… :<表达式>
arg1/arg2/arg3为函数的参数(函数输入),表达式相当于函数体,运算结果是表达式的运算结果。
例:
my_func = lambda x: 2*x
my_func(2)
[(lambda x: 2*x)(i) for i in range(5)]
#固定语法(lambda x: x + 1)(2)
a=[1,2,3]
print(a)
b=list('123')
b
#以上两种方法都可以表示列表;元组用(),列表用[],元组的元素不能修改
zip对象与enumerate方法
list('123')
L1, L2, L3 = list('abc'), list('def'), list('hij')
for i, j, k in zip(L1, L2, L3):
print(i,j,k)
#遍历zip当中的所有,并且很奇怪的是为什么打印出来是竖着格式
for index,value in enumerate(L1):
print(index,value)
#enumerate 是一种特殊的打包,它可以在迭代时绑定迭代元素的遍历序号
dict(zip(L1,L2))
#对两个列表建立字典映射
zipped=list(zip(L1,L2,L3))
list(zip(*zipped))
#*zipped是解压函数
二、numpy基础
讨论一些特殊数组的生成方式
arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
...: arr2d
...:
Out[9]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
等差数列:
np.linspace(1,5,11) # 起始、终止(包含)、样本个数
np.arange(1,5,2) # 起始、终止(不包含)、步长
特殊矩阵:
np.zeros((2,3))#返回给定形状和类型的新数组,用零填充
np.eye(3) # 3*3的单位矩阵
np.eye(3, k=1) # 偏移主对角线1个单位的伪单位矩阵
np.full((2,3), 10) # 元组传入大小,10表示填充数值
np.full((2,3), [1,2,3]) # 通过传入列表填充每列的值
随机矩阵:np.random
最常用的随机生成函数为 rand, randn, randint, choice ,它们分别表示0-1均匀分布的随机数组、标准正态的随机数组、随机整数组和随机列表抽样:
均匀分布:
np.random.rand(3) # 生成服从0-1均匀分布的三个随机数
np.random.rand(3, 3) # 注意这里传入的不是元组,每个维度大小分开输入
a, b = 5, 15
(b - a) * np.random.rand(3) + a #对于服从区间 a 到 b 上的均匀分布
标准正态分布:
np.random.randn(3)#标准正态分布
sigma, mu = 2.5, 3
mu + np.random.randn(3) * sigma #对于服从特定方差和均值的一元正态分布
随机整数:
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, size=2, replace=False, p=[0.1, 0.7, 0.1 ,0.1])#size代表随机选择个数,replace代表抽样之后是否放回,p没有指定的时候相当于是一致的分布
区间上均匀分布
三、np数组的变形与合并
一、转置
np.zeros((2,3)).T
二、合并操作:
r_ 和 c_ 分别表示上下合并和左右合并
例:
np.r_[np.zeros((2,3)),np.zeros((2,3))]
np.c_[np.zeros((2,3)),np.zeros((2,3))]
三、维度变换:reshape
在使用时有两种模式,分别为C 模式和 F 模式,分别以逐行和逐列的顺序进行填充读取。
target = np.arange(8).reshape(2,4)
target.reshape((4,2), order='C') # 按照行读取和填充
target.reshape((4,2), order='F') # 按照列读取和填充
target.reshape(-1) #把数组转为一维
四、np数组的切片与索引
1、基本切片操作
x=np.arange(10)
x[5:8]
output:array([5, 6, 7])
2、切片赋值
>>>x[5:8]=12
>>>x
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
>>>x[:]=-1
>>>x
x([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])
3、高阶数组索引(指定是数组的第几行第几列)
>>> arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr2d[2] array([7, 8, 9])
>>> arr2d[0][2]
3
4、布尔型索引
五、常用函数
where
In [80]: a = np.array([-1,1,-1,0])
In [81]: np.where(a>0, a, 5) # 对应位置为True时填充a对应元素,否则填充5
nonzero、argmax、argmin
这三个函数返回的都是索引, nonzero 返回非零数的索引, argmax, argmin 分别返回最大和最小数的索引:
In [82]: a = np.array([-2,-5,0,1,3,-1])
In [83]: np.nonzero(a)Out[83]: (array([0, 1, 3, 4, 5], dtype=int64),)
In [84]: a.argmax()Out[84]: 4
In [85]: a.argmin()Out[85]: 1
any、all
any 指当序列至少 存在一个 True 或非零元素时返回 True ,否则返回 False
all 指当序列元素 全为 True 或非零元素时返回 True ,否则返回 False
In [86]: a = np.array([0,1])
In [87]: a.any()
Out[87]: True
In [88]: a.all()
Out[88]: False
cumprod、cumsum、diff
cumprod, cumsum 分别表示累乘和累加函数,返回同长度的数组, diff 表示和前一个元素做差,即时间序列当中的一阶差分
In [89]: a = np.array([1,2,3])
In [90]: a.cumprod()
Out[90]: array([1, 2, 6], dtype=int32)
In [91]: a.cumsum()
Out[91]: array([1, 3, 6], dtype=int32)
In [92]: np.diff(a)
Out[92]: array([1, 1])
统计函数:min、max、mean, median, std, var, sum, quantile
略过缺失值用nan类型函数
In [93]: target = np.arange(5)
In [94]: target
Out[94]: array([0, 1, 2, 3, 4])
In [95]: target.max()
Out[95]: 4
In [96]: np.quantile(target, 0.5) # 0.5分位数
Out[96]: 2.0
In [100]: np.nanmax(target)
Out[100]: 2.0
协方差和相关系数cov、corrcoef
In [102]: target1 = np.array([1,3,5,9])
In [103]: target2 = np.array([1,5,3,-9])
In [104]: np.cov(target1, target2)
Out[104]: array([[ 11.66666667, -16.66666667],
[-16.66666667, 38.66666667]])
In [105]: np.corrcoef(target1, target2)
Out[105]: array([[ 1. , -0.78470603],
[-0.78470603, 1. ]])
六、向量与矩阵的计算
a、向量内积:dot
In [122]: a = np.array([1,2,3])
In [123]: b = np.array([1,3,5])
In [124]: a.dot(b)
Out[124]: 22
b、矩阵乘法:@