一、python基础
1、列表推导式与条件赋值
L=[]
def my_func(x):
return 2*x
for i in range(10):
L.append(my_func(i))
L
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[my_func(i) for i in range(10)]#列表推导式
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
列表推导式多层嵌套
[m+n for m in [1,2,3] for n in [4,5,6]]#列表推导式多层嵌套
[5, 6, 7, 6, 7, 8, 7, 8, 9]
条件赋值
v='I love you' if 5>6 else 'I hate you'#条件赋值
v
'I hate you'
a,b=3,4
condition=a>b
if condition:
v=a
else:
v=b
l=[1,2,3,4,5,6,7,8,9]
[i if i<5 else 5 for i in l]
[1, 2, 3, 4, 5, 5, 5, 5, 5]
2、匿名函数与MAP方法
my_func=lambda x:x**2#匿名函数
my_func(3)
9
multi_para_func=lambda a,b:a+b
multi_para_func(3,4)
7
[(lambda x: x*2)(i) for i in range(10)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
list(map(lambda x:2*x,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
list(map(lambda a,b:a+b,range(5),[6,7,8,9,10]))
[6, 8, 10, 12, 14]
my_func=lambda x:x**2#匿名函数
my_func(3)
9
multi_para_func=lambda a,b:a+b
multi_para_func(3,4)
7
[(lambda x: x*2)(i) for i in range(10)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
list(map(lambda x:2*x,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
list(map(lambda a,b:a+b,range(5),[6,7,8,9,10]))
[6, 8, 10, 12, 14]
3、zip对象与enumrate方法
l1=list('abc')
print(l1)
for index,value in enumerate(l1):
print(index,value)
['a', 'b', 'c']
0 a
1 b
2 c
l1=list('abc')
for index,value in zip(range(len(l1)),l1):
print(index,value)
0 a
1 b
2 c
l1=list('abc')
l2=[1,2,3]
D=dict(zip(l1,l2))
print(D)
{'a': 1, 'b': 2, 'c': 3}
解压:
l1=list('abc')
l2=[1,2,3]
l3=list('xyz')
Z=list(zip(l1,l2,l3))
print(Z)
z=list(zip(*Z))#解压
print(z)
[('a', 1, 'x'), ('b', 2, 'y'), ('c', 3, 'z')]
[('a', 'b', 'c'), (1, 2, 3), ('x', 'y', 'z')]
二、numpy基础
1、np数组的构造:
import numpy as np
a1=np.array([1,2,3])
print(a1)
[1 2 3]
等差数列:
a2=np.linspace(1,10,8)#从1到10,等差取8个数
print(a2)
[ 1. 2.28571429 3.57142857 4.85714286 6.14285714 7.42857143
8.71428571 10. ]
a3=np.arange(1,10,2)#从1到10,以2为步长的等差数列
print(a3)
[1 3 5 7 9]
zeros,eye,full矩阵:
a4=np.zeros((3,3))#3*3的矩阵
print(a4)
a5=np.eye(5)#5*5的单位矩阵
print(a5)
a6=np.eye(5,k=1)#偏移主对角线1个单位的伪单位矩阵
print(a6)
a7=np.full((4,5),2)#创建4*5的矩阵,填充2
print(a7)
a8=np.full((4,5),[1,2,3,4,5])#列表填充每一列的值
print(a8)
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
[[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]]
[[2 2 2 2 2]
[2 2 2 2 2]
[2 2 2 2 2]
[2 2 2 2 2]]
[[1 2 3 4 5]
[1 2 3 4 5]
[1 2 3 4 5]
[1 2 3 4 5]]
随机数生成:
r1=np.random.rand(3)#生成3个随机数,0-1均匀分布
print(r1)
r2=np.random.rand(3,3)#生成3*3的矩阵,0-1均匀分布
print(r2)
a,b=10,20
r_a_b=(b-a)*np.random.rand(10)+a#生成10个[a,b]的随机数
print(r_a_b)
[0.64567505 0.70645119 0.94425219]
[[0.15387242 0.20973148 0.67030315]
[0.61440422 0.29854377 0.88316471]
[0.58581027 0.23526848 0.41332771]]
[16.17190947 11.21557427 10.12546842 13.89429609 15.92681769 14.74233328 10.98869316 12.86417526 12.18595352 17.14021395]
randn:
r1=np.random.randn(5)#生成5个0-1分布的随机数
print(r1)
r2=np.random.randn(2,3)#生成2*3的矩阵的标准正态分布的随机数
print(r2)
sigma,mu=2,3
n1=mu+np.random.randn(3)*sigma
print(n1)
[-0.45466238 0.47113798 1.12117916 0.32488041 0.23918829]
[[ 0.30322665 1.71965957 0.60957456]
[-1.04228866 -1.04621328 0.1132734 ]]
[2.90320904 1.0696739 2.01430317]
randint:
l,h,s=10,20,(3,4)
a3=np.random.randint(l,h,s)#最小值,最大值,维度
print(a3)
[[19 14 16 12]
[10 13 17 14]
[15 17 19 15]]
choice:
a4=np.random.choice([1,2,3,4],(2,3),replace=True,p=[0.7,0.1,0.1,0.1])
print(a4)
a4=np.random.choice([1,2,3,4,5,6,7,8],(2,3),replace=False)
print(a4)
[[1 1 1]
[1 1 2]]
[[7 5 1]
[2 4 8]]
permutation:
打散数据
a5=[1,2,3,4,5]
a6=np.random.permutation(a5)
print(a6)
[5 1 4 3 2]
随机种子:固定随机数
np.random.seed(10)
a7=np.random.rand(10)
print(a7)
[0.77132064 0.02075195 0.63364823 0.74880388 0.49850701 0.22479665
0.19806286 0.76053071 0.16911084 0.08833981]
如果没有固定随机数,每一次运行的结果都会不一样。
2、数组的合并与变形
转置:
n1=np.random.rand(3,4)
print(n1.T)
[[0.50902337 0.89446865 0.26779241]
[0.24319435 0.97336943 0.59433837]
[0.61993015 0.333194 0.86417938]
[0.87975344 0.08898697 0.40642231]]
合并:
r_:(上下合并)
c_:(左右合并)
n1=np.random.rand(3,4)
print(np.r_[n1,n1])
print(np.c_[n1,n1])
[[0.08162041 0.10784975 0.206065 0.67891978]
[0.27575327 0.27232511 0.02302929 0.34596961]
[0.3797719 0.08531164 0.55571834 0.71515822]
[0.08162041 0.10784975 0.206065 0.67891978]
[0.27575327 0.27232511 0.02302929 0.34596961]
[0.3797719 0.08531164 0.55571834 0.71515822]]
[[0.08162041 0.10784975 0.206065 0.67891978 0.08162041 0.10784975
0.206065 0.67891978]
[0.27575327 0.27232511 0.02302929 0.34596961 0.27575327 0.27232511
0.02302929 0.34596961]
[0.3797719 0.08531164 0.55571834 0.71515822 0.3797719 0.08531164
0.55571834 0.71515822]]
不同维度的合并:
行列数要保持一致
a1=[1,2,3]
a2=[[3,4],[5,6],[7,8]]
print(np.c_[a1,a2])
print(np.r_[np.array([0,0]),np.zeros(2)])
[[1 3 4]
[2 5 6]
[3 7 8]]
[0. 0. 0. 0.]
维度转换:reshape
a=np.array([1,2,3,4,5,6])
print(a)
b=a.reshape(2,3)
print(b)
c=b.reshape((3,2),order='F')#order='C'按行读取并填充,'F'为按列读取并填充
print(c)
[1 2 3 4 5 6]
[[1 2 3]
[4 5 6]]
[[1 5]
[4 3]
[2 6]]
维度转换时,可以有一个维度空缺。
a=np.array([1,2,3,4,5,6])
b=a.reshape((2,-1))
c=a.reshape((-1,2))
print(b)
print(c)
[[1 2 3]
[4 5 6]]
[[1 2]
[3 4]
[5 6]]
将一列转换为一行:
a=np.full((3,1),2)
print(a)
b=a.reshape(-1)
print(b)
[[2]
[2]
[2]]
[2 2 2]
3、np数组的切片与索引
切片:
a=np.arange(10)
print(a[2:5])
b=a.reshape(2,5)
print(b)
print(b[:,[1,2]])
[2 3 4]
[[0 1 2 3 4]
[5 6 7 8 9]]
[[1 2]
[6 7]]
对以为数组取布尔值:
a=np.arange(10)
print(a[a%3==1])
a=np.arange(10)
print(a[a%3==1])
4、常用函数
where:
a=np.array([1,2,3,4,5,6])
b=np.where(a%2==1,1,0)
print(b)
[1 0 1 0 1 0]
where方法类似与Excel中的if函数。
nonzero,argmax,argmin,返回数据索引
a=np.array([1,2,3,4,5,6,0,-1,-2,-3,-4,-5,-6])
b=np.nonzero(a)
c=np.argmax(a)
d=np.argmin(a)
print(b)
print(c)
print(d)
(array([ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12]),)
5
12
any:至少一个0,返回True,否则False
all:全部非0,返回True,否则False
a = np.array([1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4, -5, -6])
print(a.all())
print(a.any())
False
True
cumprod:累乘
cumsum:累加
diff:与前一个作差
a = np.array([1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4, -5, -6])
b=a.cumsum()
c=a.cumprod()
d=np.diff(a)
print(b)
print(c)
print(d)
[ 1 3 6 10 15 21 21 20 18 15 11 6 0]
[ 1 2 6 24 120 720 0 0 0 0 0 0 0]
[ 1 1 1 1 1 -6 -1 -1 -1 -1 -1 -1]
统计函数:
max,min,mean,median,std,var,sum,quantile
a = np.array([1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4, -5, -6])
b=a.max()
c=a.min()
d=a.mean()
e=np.median(a)
f=np.std(a)
g=np.var(a)
h=a.sum()
print(b,c,d,e,f,g,h)
print(np.quantile(a,0.25))
6 -6 0.0 0.0 3.7416573867739413 14.0 0
-3.0
cov:协方差
corrcoef:相关系数
a = np.array([1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4, -5, -6])
b=np.arange(13)
c=np.corrcoef(a,b)
d=np.cov(a,b)
print(c)
print(d)
[[ 1. -0.80769231]
[-0.80769231 1. ]]
[[ 15.16666667 -12.25 ]
[-12.25 15.16666667]]
axis=0,按行统计,结果为列的指标,axis=1,按列统计,结果为行的指标
a = np.array([1, 2, 3, 4, 5, 6, 0, -1, -2, -3, -4, -5])
a=a.reshape((3,-1))
print(a)
print(a.sum(0))
print(a.sum(1))
[[ 1 2 3 4]
[ 5 6 0 -1]
[-2 -3 -4 -5]]
[ 4 5 -1 -2]
[ 10 10 -14]
广播机制
标量和数组:
标量和数组运算,进行逐个操作:
a=np.ones((3,3))
print(a)
b=a*3+1
print(b)
c=1/b
print(c)
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
[[4. 4. 4.]
[4. 4. 4.]
[4. 4. 4.]]
[[0.25 0.25 0.25]
[0.25 0.25 0.25]
[0.25 0.25 0.25]]
两个数组进行运算,需要维度一致。
a=np.ones((3,3))
b=np.full((3,3),2)
c=a+b
print(c)
[[3. 3. 3.]
[3. 3. 3.]
[3. 3. 3.]]
一维与二维数组的操作:
a=np.array([1,2,3])
b=np.full((3,3),2)
c=a+b
print(c)
[[3 4 5]
[3 4 5]
[3 4 5]]
将一维扩充为二维再计算.
向量与矩阵的运算:
向量内积:dot
a=np.array([1,2,3])
b=np.arange(3)
c=a.dot(b)
print(c)
8
向量范数与矩阵范数:
np.linalg.norm
a=np.arange(6).reshape(2,3)
print(a)
print(np.linalg.norm(a,'fro'))
print(np.linalg.norm(a,np.inf))
print(np.linalg.norm(a,2))
b=np.arange(4)
print(np.linalg.norm(b,np.inf))
print(np.linalg.norm(b,2))
print(np.linalg.norm(b,3))
[[0 1 2]
[3 4 5]]
7.416198487095663
12.0
7.3484692283495345
3.0
3.7416573867739413
3.3019272488946263
矩阵相乘:
@
a=np.array([1,2,3,4]).reshape(2,2)
b=np.arange(4).reshape(2,2)
c=a@b
print(c)
[[ 4 7]
[ 8 15]]
练习:
1、
m1=np.random.rand(2,3)
m2=np.random.rand(3,4)
print(m1.shape[0],m2.shape[1])
a=[(m1[i][k]*m2[k][j]) for i in range(m1.shape[0]) for j in range(m2.shape[1]) for k in range (m1.shape[1])]
print(a)