Numpy的6道习题

这篇博客通过6个练习展示了如何使用Numpy和Scipy库来处理线性代数中的常见问题,包括矩阵运算、求解线性方程组、计算范数和特征值、幂迭代法寻找最大特征值及对应的特征向量,以及生成二项分布矩阵并求其最大特征值。同时,还介绍了一个找出数组中与给定数值最接近的数的函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9.1题是进行矩阵的运算,由于这些操作都已经有对应的函数,所以只用直接调用函数即可

#Exercise 9.1

import numpy as np
from scipy.linalg import toeplitz
def caculate_with_k(A,B,m,k):
I = np.eye(m,m,0)
return np.dot(A,B-k*I)
n = 200
m = 500
k = np.random.randn()
A = np.random.randn(n,m)
B = toeplitz(np.random.randn(1,m), r=np.random.randn(1,m))
print(A+A)
print(np.dot(A,A.T))
print(np.dot(A.T,A))
print(np.dot(A,B))
print("k=",k)

print(caculate_with_k(A,B,m,k))#计算A(B-λI) 其中λ用k表示

9.2题是求一个线性方程组,由于numpy中也已经定义了这个函数,所以也是直接调用即可

#Exercise 9.2
import numpy as np
from scipy.linalg import toeplitz
m = 500
B = toeplitz(np.random.randn(1,m), r=np.random.randn(1,m))
b = np.random.randn(m)
x = np.linalg.solve(B,b)

print(x)

9.3题是求范数以及最大最小特征值,同样numpy中也已经定义了相关函数函数,所以也是直接调用即可

#Exercise 9.3
import numpy as np
from scipy.linalg import toeplitz
n = 200
m = 500
A = np.random.randn(n,m)
B = toeplitz(np.random.randn(1,m), r=np.random.randn(1,m))
U,sigma,vt = np.linalg.svd(B)
print(np.linalg.norm(A,ord='fro'))#Frobenius norm of A
print(np.linalg.norm(B,ord=np.inf))#infinity norm of B
print(sigma.max())#largest singular values of B 
print(sigma.min())#smallest singular values of B 

9.4题是要求利用幂迭代求矩阵最大的特征值及其对应的特征向量

通过查找相关资料找到了幂迭代的算法如下:

①输入矩阵 A、初始向量v(0),误差 eps,实用中一般取 v(0)=(1,1,···,1)T ;  

②k←1; 

③计算 v(k) ←Au(k-1);  

④mk ←max{ v(k) },mk-1 ←{ v(k-1) };

⑤u(k) ←v(k)/ mk ; 

⑥如果▕  mk  - m k-1▕<eps,则显示特征值λ1←和对应的特征 向量x(1),终止;  

⑦k=k+1,转③

然后照着这个算法写循环即可。

import numpy as np
from scipy.linalg import toeplitz
n = 200
Z = np.random.randn(n,n)
V = np.ones(n).T
U = V/V.max()
k=0
eps = 0.00001
while(1):
k=k+1
m0 = V.max()
V = np.dot(Z,U)
m1 = V.max()
U = V/m1
if(abs(m1-m0)<eps):
print("特征值:",m1)
print("对用的特征向量:",U*m1)
print("次数k:",k)
break

9.5题是利用二项分布的生成只有0,1随机数的一个n*n矩阵,然后求该矩阵的最大特征值。

由于求特征值已有相关函数,所以直接调用即可。然后让n为2~200之间的一个随机整数,p为0~1之间的一个随机数,运行多次后发现,但n和p越大,最大的特征值也会越大。

import numpy as np
from scipy.linalg import toeplitz
n = np.random.randint(2,200)
p = np.random.rand()
print("n=",n)
print("p=",p)
C = np.random.binomial(1,p,(n,n))
e = np.linalg.eigvals(C)
print("largest singular value:",e.max())

9.6题是写一个函数,该函数可以求一个给定数组距离z最接近的数。

由于numpy提供了argmin这个函数可以返回最小数的索引值,所以只用将原数组复制给A,让A中的每一个数等于本来的数与Z的差值的绝对值,然后利用argmin找到最小值的索引,最后返回这个索引对应的数即可

#Exercise 9.6

import numpy as np
from scipy.linalg import toeplitz
def cloest_value(array,z):
A = array[:]
A = abs(A-z)
return np.ravel(array)[np.argmin(A)]
array = np.random.randn(1,20)
z = np.random.randn()
print(array)
print("z=",z)
print("cloest value=",cloest_value(array,z))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值