高级编程技术_课后作业(十四)

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)作为矩阵的第一个元素,同时打印一条警告信息。


代码:

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)

结果截图:




猜你喜欢

转载自blog.csdn.net/zero_s_qiu/article/details/80387676
今日推荐