数组
创建
import numpy as np
# np.array() 生成元素同类型的数组
a1=np.array([1,2,3,4]) # 整型
a2=np.array([1.0,2,3,4]) # 浮点型
a3=np.array([1,2,3,4],dtype=float)
a4=np.array(['1',2,3,4]) # 字符串
# np.astype() 数值类型转换
a=a4.astype(int)
print(a.dtype)
# np.arange(start,stop,step,dtype)
# 生成[start,stop)区间上步长为step,类型为dtype的等差数组
b1=np.arange(1,4)
b2=np.arange(0,10,2)
# np.linspace(start,stop,num=50,endpoint=True)
# 生成区间[start,stop]区间上间隔相等的num个数据的等差数组,默认包含区间终点
c1=np.linspace(0,100)
c2=np.linspace(0,10,num=3,endpoint=False)
# np.logspace(start,stop,num=50,endpoint=True,base=10.0)
# 默认生成区间[10^start,10^stop]上的num个数据的等比数列
d1=np.logspace(0,1)
d2=np.logspace(0,8,num=3,base=2,dtype=int)
创建特定数组
import numpy as np
# np.ones(shape,dtype=None,order='C') 生成元素全为1的矩阵
# order:C 行优先,F:列优先
a1=np.ones((2,3),dtype=int)
a2=np.ones((3,4),dtype=[('x','int'),('y','float')])
# np.zeros(shape,dtype=float,order='C') 生成元素全为0的矩阵
b=np.zeros((3,2),dtype=int)
# np.empty(shape,dtype=float,order='C') 生成给定维度、数值类型以及存储顺序的未初始化(任意值)的数组。
c=np.empty((2,3))
# np.eye(N, M=None, k=0, dtype=<class 'float'>) 2维数组,单位矩阵
# 不输入参数M的时候默认等于N
# k:对角线索引,0为主对角线,正值为对角线上移,负值为对角线下移
d1=np.eye(3)
d2=np.eye(2,3)
d3=np.eye(3,k=2)
# np.zeros_like(a,dtype=None) 生成一个与给定数组a同规模和类型的零数组
c1=np.zeros_like(d1)
c2=np.zeros_like(d1,dtype=int)
索引
除了类似二维列表的索引a[i][j],还可以用a[i,j]的形式索引,同样可以类似列表使用切片等操作。Numpy数组的索引还可以和整数数组结合使用,以及进行布尔值索引。
1 整数数组索引
import numpy as np
a=np.arange(0,16).reshape(4,4)
"""
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
"""
ind=[0,1,2]
print(a[ind]) # 索引前3行
"""
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
"""
print(a[ind,ind]) # 索引前3行主对角线元素
"""
[ 0 5 10]
"""
2 布尔值索引
可以给出筛选条件,然后通过索引
import numpy as np
# 布尔值索引
a=np.arange(0,16).reshape(4,4)
b=a<=5
"""
[[ True True True True]
[ True True False False]
[False False False False]
[False False False False]]
"""
print(a[b])
"""
[0 1 2 3 4 5]
"""
合并与分解
函数 | 说明 |
---|---|
hstack | 按水平顺序重新堆叠排序两个数组 |
vstack | 按垂直顺序重新堆叠排序两个数组 |
线性代数运算 linalg模块
基本运算
函数 | 说明 |
---|---|
kron | K积 |
matmul | 矩阵乘法 |
dot | 向量作内积,矩阵作乘法 |
inner | 数组作内积,返回nd数组类型 |
分解
函数 | 说明 |
---|---|
qr | 矩阵的QR分解 |
svd | 奇异值分解 |
cholesky | Cholesky分解,常出现在最小二乘法 |
线代上一些常见的矩阵分解可以见本人自己写的一篇公众号推文:常见的几种矩阵分解
以下只做简单描述和范例展示。
QR分解
通常是把可逆矩阵分解为正交矩阵和对角线元素都为正数的上三角矩阵的乘积。
是对线性无关向量组进行施密特正交单位化的矩阵表达。
import numpy as np
import numpy.linalg as nl
a = np.array([[1,1,0,0],
[1,0,1,0],
[-1,0,0,1],
[1,-1,-1,1]])
Q,R= nl.qr(a)
print(np.matmul(Q,R)) # 验证
奇异值分解
对于可逆矩阵A,存在正交矩阵
Q
1
,
Q
2
Q_1,Q_2
Q1,Q2使得
Q
1
A
Q
2
Q_1AQ_2
Q1AQ2为对角矩阵,主对角元为
λ
i
\lambda_i
λi满足
λ
i
2
\lambda_i^2
λi2是
A
A
T
AA^T
AAT的全部特征根。
对于不可逆以及非方阵同样如此,但是“对角线”上可能会有0元。
import numpy as np
import numpy.linalg as nl
a = np.array([[1,1,1],
[-1,0,1],
[0,-1,1]])
U,S,vh= nl.svd(a)
Cholesky分解
是针对正定矩阵的分解,即正定矩阵可以分解为下三角矩阵与其转置矩阵的乘积。
import numpy as np
import numpy.linalg as nl
a = np.array([[4, 12, -16],
[12, 37, -43],
[-16, -43, 98]])
L = nl.cholesky(a)
print(L)
"""
[[ 2. 0. 0.]
[ 6. 1. 0.]
[-8. 5. 3.]]
"""
特征值
函数 | 说明 |
---|---|
eig | 计算方阵的特征值和右特征向量 |
eigh | 返回埃尔米特矩阵或实对称矩阵的特征值和特征向量 |
eigvalsh | 计算复杂的埃尔米特矩阵或实对称矩阵的特征值 |
import numpy as np
import numpy.linalg as nl
# eig
eigenvalues, eigenvectors = nl.eig(np.diag((1, 2, 3)))
范数和其他
函数 | 说明 |
---|---|
norm | 矩阵或向量范数 |
det | 矩阵行列式 |
matrix_rank | 使用svd方法返回矩阵的秩 |
trace | 数组对角线的和/矩阵的迹 |
解方程和逆矩阵
广义逆的定义和性质可以参考《高等代数》(丘维声)相关章节
函数 | 说明 |
---|---|
solve | 求解线性方程组,只能求有唯一解的方程组 |
lstsq | 返回线性方程的最小二乘解 |
inv | 矩阵求逆 |
pinv | 矩阵求广义逆 |
import numpy as np
import numpy.linalg as nl
# solve
a = np.array([[1,2,1],[0,1,0],[0,0,1]])
b = np.array([1,0,0])
x=nl.solve(a,b)
# inv
a=np.array([[1,2,1],[0,1,0],[0,0,1]])
b=nl.inv(a)
# pinv
a=np.array([[1,2,1],[0,1,0]])
b=nl.pinv(a)