Skip to content

Commit 88b2242

Browse files
authored
Update python_numpy.py
1 parent efa1485 commit 88b2242

1 file changed

Lines changed: 112 additions & 0 deletions

File tree

python_numpy.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,115 @@
204204
print(b2)
205205
print(a2)
206206
print(arr2)
207+
208+
# 线性代数模块(linalg)
209+
# 求范数
210+
a=np.array([5,12])
211+
print(a)
212+
b=np.linalg.norm(a) # norm表示范数,默认求2范数,ord=1求1范数,ord=np.inf求无穷范数
213+
print(b)
214+
215+
# 求矩阵的迹、行列式、秩、特征值、特征向量
216+
b = np.array([
217+
[1, 2, 3],
218+
[4, 5, 6],
219+
[7, 8, 9]
220+
])
221+
222+
print(np.trace(b)) # 15,求矩阵的迹(主对角线上各个元素的总和)
223+
224+
c=np.linalg.det(b)
225+
print(c) # 输出一个很小的值6.66133814775e-16,求矩阵的行列式值
226+
# 如果希望输出为0,使用round(c, 2),四舍五入保留小数点后两位
227+
# 不过对精度要求高可以使用decimal模块
228+
229+
c=np.linalg.matrix_rank(b)
230+
print(c) # 2,求矩阵的秩
231+
232+
u,v=np.linalg.eig(b) # u为特征值
233+
print(u)
234+
print(v)
235+
236+
# 矩阵分解
237+
# Cholesky分解并重建
238+
d = np.array([
239+
[2, 1],
240+
[1, 2]
241+
])
242+
243+
l = np.linalg.cholesky(d)
244+
print(l) # 得到下三角矩阵
245+
e=np.dot(l, l.T)
246+
print(e) # 重建得到矩阵d
247+
248+
249+
# 对不正定矩阵,进行SVD分解并重建
250+
U, s, V = np.linalg.svd(d)
251+
252+
S = np.array([
253+
[s[0], 0],
254+
[0, s[1]]
255+
])
256+
257+
print(np.dot(U, np.dot(S, V))) # 重建得到矩阵d
258+
259+
# 矩阵乘法
260+
# https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html#numpy.dot
261+
print(np.dot(3, 4)) # 12,0-D矩阵相乘(也就是标量相乘)
262+
263+
print(np.dot([2j, 3j], [2j, 3j])) # (-13+0j),1-D矩阵相乘(实际上是向量做点积)
264+
265+
a=[[1, 0], [0, 1]]
266+
b=[[4, 1, 0], [2, 2, 0]]
267+
print(np.dot(a, b))
268+
'''
269+
array([[4, 1],
270+
[2, 2]])
271+
2-D矩阵相乘
272+
这里是2*2矩阵和2*3矩阵相乘,结果为2*3矩阵
273+
'''
274+
275+
a=[[1, 0], [1, 2]]
276+
b=[2,2]
277+
c=np.dot(a,b)
278+
print(c)
279+
'''
280+
[2 6]
281+
注意这里b是向量
282+
numpy处理时并不是按照矩阵乘法规则计算
283+
而是向量点积
284+
也就是np.dot([1, 0],[1, 2])和np.dot([1, 2],[2,2])
285+
'''
286+
287+
# 再做个实验来区别向量乘法和矩阵乘法
288+
b=np.array([
289+
[1, 2, 3],
290+
[4, 5, 6],
291+
[7, 8, 9]
292+
])
293+
294+
# 这里插播一下,np.array([1,0,1])是3维向量,而不是1*3的矩阵
295+
c1=np.array([[1,0,2]])
296+
print(c1.shape) # (1, 3),这是一个1*3的矩阵
297+
c2=np.array([1,0,2])
298+
print(c2.shape) # (3,),这是一个3维向量
299+
300+
# print(np.dot(b,c1)) # 报错,不符合矩阵乘法规则
301+
print(np.dot(b,c2)) # [ 7 16 25],点积运算
302+
303+
print(np.dot(c1,b)) # [[15 18 21]],矩阵乘法运算规则
304+
print(np.dot(c2,b)) # [15 18 21],点积运算
305+
306+
# 还要补充一下,如果是用python自带的*运算符计算则是广播机制
307+
print(b*c1) # print(b*c2)结果一样
308+
'''
309+
[[ 1 0 6]
310+
[ 4 0 12]
311+
[ 7 0 18]]
312+
'''
313+
print(b+c1) # print(b*c2)结果一样
314+
'''
315+
[[ 2 2 5]
316+
[ 5 5 8]
317+
[ 8 8 11]]
318+
'''

0 commit comments

Comments
 (0)