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)
结果截图: