Numpy
下面为作业文档中Numpy这一章的内容
题目
解答
Exercise 9.1
高斯随机分布矩阵的生成:
numpy.random.normal(loc=0.0, scale=1.0, size=None) ,其中loc为均值,scale为方差,size为输出形状
乘法:numpy中*是矩阵元素逐个计算,np.dot(a,b)是按照矩阵乘法的运算法则来运算
toeplitz--生成托普利兹矩阵
T=toeplitz(c,r)生成非对称托普利兹矩阵,将c作为第一列,r作为第一行,若c(1)与r(1)不相等,则使用c(1)作为矩阵的第一个元素,同时打印一条警告信息。
T=toeplitz(c,r)生成非对称托普利兹矩阵,将c作为第一列,r作为第一行,若c(1)与r(1)不相等,则使用c(1)作为矩阵的第一个元素,同时打印一条警告信息。
代码:
import numpy as np
from scipy.linalg import toeplitz
n = 200
m = 500
A = np.random.normal(size = (n,m))
print("A+A\n")
print(A+A)
print("AA'\n")
print(np.dot(A, A.T))
print("A'A\n")
print(np.dot(A.T, A))
c = np.random.normal(size = (1,500))
r = np.random.normal(size = (1,500))
B = toeplitz(c,r)
print("AB\n")
print(np.dot(A,B))
def A_B_I(r):
A = np.random.normal(size = (n,m))
c = np.random.normal(size = (1,m))
r = np.random.normal(size = (1,m))
B = toeplitz(c,r)
I = np.identity(m)
return (np.dot(A, (B - r*I)))
print("A(B-rI)\n")
print(A_B_I(5))
结果截图:
Exercise 9.2
代码:
import numpy as np
from scipy.linalg import toeplitz
m = 500
c = np.random.normal(size = (1,m))
r = np.random.normal(size = (1,m))
B = toeplitz(c,r)
b = np.random.permutation(m)
ans = np.linalg.solve(B, b)
print("Ans:\n")
print(ans)
结果截图:
Exercise 9.3
代码:
import numpy as np
from scipy.linalg import toeplitz
n = 200
m = 500
A = np.random.normal(size = (n,m))
c = np.random.normal(size = (1,500))
r = np.random.normal(size = (1,500))
B = toeplitz(c,r)
frobenius = np.linalg.norm(A, "fro")
infinity = np.linalg.norm(B, np.inf)
e = np.linalg.eigvals(B)
print("the Frobenius norm of A: ")
print(frobenius)
print("\nthe infinity norm of B")
print(infinity)
print("\nthe largest singular values of B: ")
print(max(e))
print("\nthe smallest singular values of B: ")
print(min(e))
结果截图:
Exercise 9.4
代码:
import time
import numpy as np
from scipy.linalg import toeplitz
for n in range(2, 6):
start_CPU = time.clock()
i = 1
eig = 0
Z = np.random.normal(1,1,size = (n,n))
u = np.random.randn(n)
print("##Test of " + str(n))
while True:
v = np.dot(Z, u)
last = eig
#eig = np.linalg.norm(v, np.inf)
eig = v[np.argmax(np.abs(v))]
u = v / eig
if (i != 1) & (abs(last - eig) < (1/2)*(10**(-5))):
break
i = i + 1
print("迭代次数:")
print(i)
end_CPU = time.clock()
print("\nThe time of " + str(n) + " is " + str(end_CPU - start_CPU))
print("\n")
print("The lagest eigenvalue of Z")
print(eig)
print("\n")
print("Its corresponding eigenvector")
print(u)
print("\n")
结果截图:
Exercise 9.5
代码:
import time
import numpy as np
from scipy.linalg import svdvals
n = 4
p = .5
C = np.random.binomial(1, p, size = (n, n))
print(C)
lsv = svdvals(C)
print(lsv.max())
结果截图:
Maybe the largest singular value = n * p
Exercise 9.6
代码:
import numpy as np
def find_Closest_Element(A, z):
return A[np.argmin(np.abs(A-z))]
n = 5
A = np.random.normal(size = (n,1))
z = np.random.randint(1)
print(z)
ans = find_Closest_Element(A, z)
#ans = find_Closest_Element(ans, z)
print(A)
print(ans)
结果截图: