numpy是python用于科学计算的基础工具库。它包含以下四大功能:
import numpy as np
import numpy as np
a1 = np.array([1, 2, 3, 4])#生成整数型数组
a2=a1.astype(float)#转化为浮点数,此命令等于下面这个
a3=np.array([1, 2, 3, 4],dtype=float)#浮点数
#查看数据类型
a1.dtype
a2.dtype
等差数列:
arange(start,none,step,dtype) 分别是下限,上限,间隔,数字类型
np.arange(0,100,2)
linspace(statrt,stop,num,endpoint=T)分别是下限,上限,生成数字的个数,是否输出最后一个数字
np.linspace(0,100,50,endpoint=False)
np.logspace(0,10,num=20,dtype=int)
a=np.ones(4,int)#输出[1, 1, 1, 1]
b=np.ones((4,3),int)#输出四行三列的1
c=np.zeros((4,3),int)#输出4行3列的0矩阵
d=np.eye(4)#生成4阶单位阵
e=np.eye(4,k=2);e#输出第k对角线元素为1,其他行元素为0的矩阵
f=np.zeros_like(a)#生成与a同维数的全0数组
a=np.arange(16).reshape(4,4);a#生成四行四列的矩阵
b=a[1][2]#输出第2行第3个,输出6,此命令等于下面这个
c=a[1,2] #输出结果也是6
x=np.array([0,1,2,1])
print(a[x==1])#输出第2行和第四行
import numpy as np
a=np.arange(16).reshape(4,4);a
b=np.floor(5*np.random.random((2,4)));b#生成一个2行4列在0到1上的随机矩阵,乘以5,只保留整数部分
c=np.ceil(4*np.random.randint(4,7,(4,2)))#生成一个4行2列在4到7上的随机整数矩阵,乘以4,ceil是向上取整函数
np.vstack([a,b])#上下合并矩阵,放在另外一个矩阵的下面
np.hstack([a,c])#左右和并矩阵
vsplit(a,m)把矩阵a平均分为m个行数组
hsplit(a,n)把矩阵a平均分为n个行数组
import numpy as np
a=np.arange(16).reshape(4,4)
b=np.vsplit(a,2);b#分成两个行数组
print(b)
c=np.hsplit(a,2)#分成两个列数组
print(c)
import numpy as np
a=np.array([[1,2,3],[0,0,1],[1,2,1]])
a.sum()#求所有元素的和
sum(a)#求每一列元素的和,与下面两个命令等价
np.sum(a,axis=0,keepdims=True)
np.sum(a,axis=0)
np.sum(a,axis=1)#逐行求和
import numpy as np
a=np.array([[1,2,3],[0,0,1],[1,2,1]])
b=np.array([[1,2,3],[1,1,1],[1,2,1]])
a/b#两个矩阵对应元素相除
a*b#两个矩阵对应元素相乘
a+b#两个矩阵对应元素相加
a-b#两个矩阵对应元素相减
a**(1/2)#a矩阵所有元素都开根号
函数 | 说明 |
---|---|
norm | 求矩阵的范数 |
inv | 求逆矩阵 |
pinv | 求矩阵的广义矩阵 |
solve | 求解线性方程组 |
det | 行列式 |
lslsq | 最小二乘法求超定方程组 |
eig | 求矩阵的特征值和特征向量 |
svd | 矩阵的奇异值分解 |
qr | 矩阵的QR分解 |
定义:范数(norm)是数学中的一种基本概念。在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即①非负性;②齐次性;③三角不等式。它常常被用来度量某个向量空间(或矩阵)中的每个向量的长度或大小。
例如:
向量 [ 1 , 2 , 3 ] T [1,2,3]^T [1,2,3]T的欧式范数(Euclidean norm) 为 1 2 + 2 2 + 3 2 = 13 \sqrt{1^2+2^2+3^2}=\sqrt{13} 12+22+32=13用于表示向量的大小,这个范数也被叫做 l 2 l_2 l2 -范数。
为方便统一,一般将任意向量 x 的 l p l_p lp -范数定义为:
∣ ∣ x ∣ ∣ = ∑ i ∣ x i ∣ p p \left| \left| x \right| \right|=\sqrt[p]{\sum_i{\left| x_i \right|^p}} ∣∣x∣∣=pi∑∣xi∣p
[参考文章](
import numpy as np
a=np.array([[0,3,4],[1,6,4]])
b=np.linalg.norm(a,axis=1)#行向量的2范数
c=np.linalg.norm(a,axis=0)#列向量的2范数
d=np.linalg.norm(a)#求矩阵的2范数
print("行向量的2范数为:",np.round(b,4))
print("列向量的2范数为:",np.round(c,4))
print("矩阵的2范数为:",np.round(d,4))
例1:
{ 3 x + y = 9 x + 2 y = 8 \begin{cases} 3x+y=9\\ x+2y=8\\ \end{cases} {3x+y=9x+2y=8
解法一:
根据 A X = B 可以求出 X = A − 1 B 于是我们可以先求出 A 的逆矩阵然后乘以 B \text{根据}AX=B\text{可以求出}X=A^{-1}B \\ \text{于是我们可以先求出}A\text{的逆矩阵然后乘以}B 根据AX=B可以求出X=A−1B于是我们可以先求出A的逆矩阵然后乘以B
import numpy as np
a=np.array([[3,1],[1,2]]);a
b=np.array([9,8]);b
np.linalg.inv(a)@b#@表示矩阵乘法
import numpy as np
a=np.array([[3,1],[1,2]]);a
b=np.array([9,8]);b
np.linalg.inv(a)@b#@表示矩阵乘法
方法二:直接根据np.linalg.solve函数来求
## 方法二:
np.linalg.solve(a,b)
求的结果都是X=2,Y=3
例2:
{ 3 x + y = 9 x + 2 y = 8 x + y = 6 \left\{ \begin{array}{c} \begin{array}{l} 3x+y=9\\ x+2y=8\\ \end{array}\\ x+y=6\\ \end{array} \right. ⎩ ⎨ ⎧3x+y=9x+2y=8x+y=6
import numpy as np
a=np.array([[3,1],[1,2],[1,1]]);a
b=np.array([9,8,6]);b
c=np.linalg.pinv(a)@b#@表示矩阵乘法
print(np.round(c,2))
求下面矩阵的特征值和特征向量
∣ 0 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0 ∣ \left| \begin{matrix} 0& 0& 0& 1\\ 0& 1& 1& 0\\ 0& 1& 0& 0\\ 1& 0& 0& 0\\ \end{matrix} \right| ∣ ∣0001011001001000∣ ∣
a=np.eye(4)
b=np.rot90(a)#将a矩阵顺时针旋转90度,得到我们将向的矩阵
c,d=np.linalg.eig(b)
print("特征值:",c)
print("eigenvector:\n",np.round(d,3))