Update python_numpy.py

master
李中梁 2018-02-24 18:06:48 +08:00 committed by GitHub
parent efa1485416
commit 88b2242fe8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 112 additions and 0 deletions

View File

@ -204,3 +204,115 @@ a2[0]=2
print(b2)
print(a2)
print(arr2)
# 线性代数模块linalg
# 求范数
a=np.array([5,12])
print(a)
b=np.linalg.norm(a) # norm表示范数默认求2范数ord=1求1范数ord=np.inf求无穷范数
print(b)
# 求矩阵的迹、行列式、秩、特征值、特征向量
b = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(np.trace(b)) # 15求矩阵的迹主对角线上各个元素的总和
c=np.linalg.det(b)
print(c) # 输出一个很小的值6.66133814775e-16求矩阵的行列式值
# 如果希望输出为0使用round(c, 2),四舍五入保留小数点后两位
# 不过对精度要求高可以使用decimal模块
c=np.linalg.matrix_rank(b)
print(c) # 2求矩阵的秩
u,v=np.linalg.eig(b) # u为特征值
print(u)
print(v)
# 矩阵分解
# Cholesky分解并重建
d = np.array([
[2, 1],
[1, 2]
])
l = np.linalg.cholesky(d)
print(l) # 得到下三角矩阵
e=np.dot(l, l.T)
print(e) # 重建得到矩阵d
# 对不正定矩阵进行SVD分解并重建
U, s, V = np.linalg.svd(d)
S = np.array([
[s[0], 0],
[0, s[1]]
])
print(np.dot(U, np.dot(S, V))) # 重建得到矩阵d
# 矩阵乘法
# https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html#numpy.dot
print(np.dot(3, 4)) # 120-D矩阵相乘也就是标量相乘
print(np.dot([2j, 3j], [2j, 3j])) # (-13+0j)1-D矩阵相乘实际上是向量做点积
a=[[1, 0], [0, 1]]
b=[[4, 1, 0], [2, 2, 0]]
print(np.dot(a, b))
'''
array([[4, 1],
[2, 2]])
2-D矩阵相乘
这里是2*2矩阵和2*3矩阵相乘结果为2*3矩阵
'''
a=[[1, 0], [1, 2]]
b=[2,2]
c=np.dot(a,b)
print(c)
'''
[2 6]
注意这里b是向量
numpy处理时并不是按照矩阵乘法规则计算
而是向量点积
也就是np.dot([1, 0],[1, 2])和np.dot([1, 2],[2,2])
'''
# 再做个实验来区别向量乘法和矩阵乘法
b=np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 这里插播一下np.array([1,0,1])是3维向量而不是1*3的矩阵
c1=np.array([[1,0,2]])
print(c1.shape) # (1, 3)这是一个1*3的矩阵
c2=np.array([1,0,2])
print(c2.shape) # (3,)这是一个3维向量
# print(np.dot(b,c1)) # 报错,不符合矩阵乘法规则
print(np.dot(b,c2)) # [ 7 16 25],点积运算
print(np.dot(c1,b)) # [[15 18 21]],矩阵乘法运算规则
print(np.dot(c2,b)) # [15 18 21],点积运算
# 还要补充一下如果是用python自带的*运算符计算则是广播机制
print(b*c1) # print(b*c2)结果一样
'''
[[ 1 0 6]
[ 4 0 12]
[ 7 0 18]]
'''
print(b+c1) # print(b*c2)结果一样
'''
[[ 2 2 5]
[ 5 5 8]
[ 8 8 11]]
'''