Numpy练习

    Generate matrices A, with random Gaussian entries, B, a Toeplitz matrix, where A ∈Rn×m and B ∈Rm×m, for n = 200, m = 500.

代码:

n,m = 200,500
A = np.asmatrix(np.random.normal(0,1,(n,m)))
B = np.asmatrix( toeplitz( [np.random.randint(0,15) for k in range(1,501)] ))


Exercise 9.1: Matrix operations 

    Calculate A + A, AA>,A>A and AB. Write a function that computes A(B−λI) for any λ. 

代码:

import numpy as np
from scipy.linalg import toeplitz

def exercise():

    n,m = 200,500
    A = np.asmatrix(np.random.normal(0,1,(n,m)))
    print("A = ",end="")
    print(A)
    print("A+A = ",end="")
    print(A+A)
    print("A*A.T = ",end="")
    print(A*A.T)
    print("A.T*A = ",end="")
    print(A.T*A)

    B = np.asmatrix( toeplitz( [np.random.randint(0,15) for k in range(1,501)] ))
    print("B = ",end="")
    print(B)
    print("A*B = ",end="")
    print(A*B)

    v = float(input("The value you want to input: ") )
    value = B-v*np.eye(500)
    print("A * (B-v*I) = ",end="")
    print(A*value)

if __name__ == "__main__":
    exercise()

输出:

A = [[-1.10225136  2.21873012  0.33921943 ... -0.58045849 -0.22609409
  -1.1485404 ]
 [-0.79951558  0.3417823  -1.53500528 ... -0.53382699 -0.27875606
   0.6064832 ]
 [-1.83764129  1.12700183  2.34544169 ...  0.58404444  0.33494688
   1.34002791]
 ...
 [ 0.14869196  1.91087847  0.27526752 ... -0.88849499  0.10884669
   1.94673766]
 [ 1.82040969  0.98783944 -0.34103696 ... -2.32697057  2.51322659
  -0.3932646 ]
 [ 0.33260388  0.50151772  0.42966366 ...  1.27819282  0.31062568
  -0.24729084]]
A+A = [[-2.20450272  4.43746023  0.67843887 ... -1.16091698 -0.45218817
  -2.29708081]
 [-1.59903115  0.68356461 -3.07001055 ... -1.06765397 -0.55751211
   1.2129664 ]
 [-3.67528258  2.25400365  4.69088339 ...  1.16808888  0.66989376
   2.68005581]
 ...
 [ 0.29738393  3.82175694  0.55053505 ... -1.77698999  0.21769337
   3.89347533]
 [ 3.64081939  1.97567887 -0.68207391 ... -4.65394115  5.02645318
  -0.78652919]
 [ 0.66520775  1.00303545  0.85932733 ...  2.55638563  0.62125136
  -0.49458167]]
A*A.T = [[ 4.63208246e+02  2.40180484e-01  3.46530645e+01 ... -4.82740565e+00
   1.43593770e+01 -2.17085074e+01]
 [ 2.40180484e-01  4.99395568e+02  7.79920974e+00 ... -2.47458350e+01
  -1.03703127e+01 -1.13860129e+01]
 [ 3.46530645e+01  7.79920974e+00  4.98845546e+02 ...  2.98096407e+01
  -2.77969133e+01 -3.60815715e+00]
 ...
 [-4.82740565e+00 -2.47458350e+01  2.98096407e+01 ...  5.70297122e+02
  -1.01518627e+01 -2.60267595e+01]
 [ 1.43593770e+01 -1.03703127e+01 -2.77969133e+01 ... -1.01518627e+01
   5.09262164e+02  1.69596816e+01]
 [-2.17085074e+01 -1.13860129e+01 -3.60815715e+00 ... -2.60267595e+01
   1.69596816e+01  5.14457478e+02]]
A.T*A = [[220.27899088  33.17327302  -7.69605592 ...  -6.22577705   7.89493968
   11.88368899]
 [ 33.17327302 207.30700145  -4.94490961 ...  11.35008009  -5.42586929
   -4.82416196]
 [ -7.69605592  -4.94490961 189.54300527 ...   7.76804105   5.16030969
    2.37855479]
 ...
 [ -6.22577705  11.35008009   7.76804105 ... 216.7720772   -4.8927115
   -8.21323537]
 [  7.89493968  -5.42586929   5.16030969 ...  -4.8927115  183.16753692
  -22.57196274]
 [ 11.88368899  -4.82416196   2.37855479 ...  -8.21323537 -22.57196274
  209.72169494]]
B = [[ 5  2 13 ...  7  8  9]
 [ 2  5  2 ... 14  7  8]
 [13  2  5 ...  3 14  7]
 ...
 [ 7 14  3 ...  5  2 13]
 [ 8  7 14 ...  2  5  2]
 [ 9  8  7 ... 13  2  5]]
A*B = [[ 2.31168967e+02  8.88960471e+01  6.84638967e+01 ...  1.92738084e+02
  -2.54989557e+01  3.08709334e+02]
 [-2.00968433e+02 -3.05183581e+01 -1.06020820e+02 ... -1.24856236e+02
  -1.17401426e+02 -1.83299043e+02]
 [ 1.78175408e+02 -1.49132894e-01  1.21106933e+01 ...  1.64014805e+02
   4.33408821e+01  2.44508398e+02]
 ...
 [-1.48937966e+02 -3.75092102e+02 -3.13060871e+02 ... -7.07733678e+01
  -2.34358754e+02 -2.00245964e+02]
 [-2.05011103e+02 -2.47971128e+02 -1.87814456e+02 ... -1.16379285e+02
  -5.07267358e+01 -1.45244630e+02]
 [ 2.28095970e+02  2.80775135e+01 -1.37630114e+01 ...  1.34247891e+02
   2.00410902e+02  5.31975865e-02]]
The value you want to input: 4
A * (B-v*I) = [[ 235.57797263   80.02112666   67.10701892 ...  195.05991792
   -24.5945794   313.30349533]
 [-197.77037044  -31.88548727  -99.88079936 ... -122.7209277
  -116.28640163 -185.72497588]
 [ 185.52597323   -4.6571402     2.72892653 ...  161.67862732
    42.00109455  239.14828636]
 ...
 [-149.53273344 -382.73561552 -314.16194073 ...  -67.21938788
  -234.79414092 -208.03291466]
 [-212.29274156 -251.92248528 -186.45030784 ... -107.07140277
   -60.77964217 -143.67157193]
 [ 226.76555493   26.0714426   -15.48166602 ...  129.13511993
   199.16839955    1.04236093]]


Exercise 9.2: Solving a linear system 

    Generate a vector b with m entries and solve Bx = b.

代码:

import numpy as np
from scipy.linalg import toeplitz

def exercise():

    B = np.asmatrix( toeplitz( [np.random.randint(0,15) for k in range(1,501)] ))
    print("B = ",end="")
    print(B)
    b = np.array(list (np.random.randint(0,15) for k in range(1,501) ))
    print("b = ",end="")
    print(b)

    print("x = ",end="")
    x = np.linalg.solve(B, b)
    print(x)

if __name__ == "__main__":
    exercise()

输出:

由于输出规模太大,故选取5*5的作为测试:

B = [[ 7 10  9 11  9]
 [10  7 10  9 11]
 [ 9 10  7 10  9]
 [11  9 10  7 10]
 [ 9 11  9 10  7]]
b = [ 7  4  6  0 10]
x = [ 1.0620155  -1.08386187  0.27061311  2.58280479 -2.27131783]


Exercise 9.3: Norms 

    Compute the Frobenius norm of A: kAkF and the infinity norm of B: kBk∞. Also find the largest and smallest singular values of B.

代码:

import numpy as np
from scipy.linalg import toeplitz

def exercise():
    n, m = 200, 500
    A = np.asmatrix(np.random.normal(0, 1, (n, m)))
    B = np.asmatrix( toeplitz( [np.random.randint(0,15) for k in range(1,501)] ))

    FrobeniusNormA = np.linalg.norm(A,'fro')
    print("The Frohenius Norm of A: ",end="")
    print(FrobeniusNormA)
    InfinityNormB = np.linalg.norm(B,np.inf)
    print("The Infinity Norm of B: ",end="")
    print(InfinityNormB)

    n1,n2,n3 = np.linalg.svd(B,full_matrices=True)
    max_singular_value = max(n2)
    min_singular_value = min(n2)
    print("max: ",end="")
    print(max_singular_value)
    print("min: ",end="")
    print(min_singular_value)

if __name__ == "__main__":
    exercise()

输出:

The Frohenius Norm of A: 315.6780718174581
The Infinity Norm of B: 3536.0
max: 3499.330487023503
min: 0.11771046122162954


Exercise 9.4: Power iteration 

    Generate a matrix Z, n × n, with Gaussian entries, and use the power iteration to find the largest eigenvalue and corresponding eigenvector of Z. How many iterations are needed till convergence?

Optional: use the time.clock() method to compare computation time when varying n.

代码:

import numpy as np
from time import clock

def power_iter(matrix_Z,error):
    u = np.random.rand(matrix_Z.shape[0])
    num_times = 0
    nextL = 1
    preL = 0
    start_t = clock()
    while abs(nextL - preL) > error or num_times == 0:
        preL = nextL
        v = matrix_Z.dot(u)
        nextL = max(abs(v))
        u = v / nextL
        num_times += 1
    end_t = clock()
    return u, nextL, num_times, end_t - start_t


if __name__ == "__main__":
    n_size = [20,100,500,1000,2000]
    for n in n_size:
        np.random.seed(0)
        Z = np.random.normal(0, 0.1, (n, n))
        eigenvector, lam, num_iters, time = power_iter(Z, 0.0001)
        print("The size = " + str(n) + ", ",end="")
        print('The Iteration times: '+ str(num_iters) + ", ",end="")
        print('the total time: ' + str(time) + ".")

输出:

分别取n = 20、100、500、1000、2000,统计每次输入的迭代次数,运行时间:

The size = 20, The Iteration times: 7186, the total time: 0.044823762223709894.
The size = 100, The Iteration times: 3441, the total time: 0.1178116618883803.
The size = 500, The Iteration times: 1831, the total time: 0.35797010994023276.
The size = 1000, The Iteration times: 15637, the total time: 10.70897158665916.
The size = 2000, The Iteration times: 1753, the total time: 4.444710261403037.

Exercise 9.5: Singular values 

    Generate an n×n matrix, denoted by C, where each entry is 1 with probability p and 0 otherwise. Use the linear algebra library of Scipy to compute the singular values of C. What can you say about the relationship between n, p and the largest singular value?

代码:

import numpy as np

def exercise():
    for n in range(3,210,3):
        matrix_C = np.zeros((n,n))
        for i in range(1,10,2):
            p = i/10
            for k in range(n):
                for l in range(n):
                    if np.random.random() > 1-p:
                        matrix_C[k][l] = 1
                    else:
                        matrix_C[k][l] = 0
            n1,n2,n3 = np.linalg.svd(matrix_C)
            max_singular_value = max(n2)
            print("The Largest Singular Value = ",max_singular_value,"p = ",p,"n = ",n)

if __name__ == "__main__":
    exercise()

输出:

为了更加全面分析数据,我遍历了从n=3每次递增3,一直到210,对每个n,均设p=0.1,0.3,0.5,0.7,0.9的情况比较其最大奇异值。

The Largest Singular Value =  1.0 p =  0.1 n =  3
The Largest Singular Value =  1.4142135623730951 p =  0.3 n =  3
The Largest Singular Value =  2.175327747161075 p =  0.5 n =  3
The Largest Singular Value =  2.732050807568877 p =  0.7 n =  3
The Largest Singular Value =  2.732050807568877 p =  0.9 n =  3
The Largest Singular Value =  1.931851652578136 p =  0.1 n =  6
The Largest Singular Value =  2.65902918377423 p =  0.3 n =  6
The Largest Singular Value =  3.9690783319193947 p =  0.5 n =  6
The Largest Singular Value =  3.998033285331483 p =  0.7 n =  6
The Largest Singular Value =  5.445270580796229 p =  0.9 n =  6
The Largest Singular Value =  2.2711376057657193 p =  0.1 n =  9
The Largest Singular Value =  2.655144368309624 p =  0.3 n =  9
The Largest Singular Value =  4.259188093238085 p =  0.5 n =  9
The Largest Singular Value =  6.531866761814029 p =  0.7 n =  9
The Largest Singular Value =  8.07880078775689 p =  0.9 n =  9
The Largest Singular Value =  2.7462872998525776 p =  0.1 n =  12
The Largest Singular Value =  3.8718097899665493 p =  0.3 n =  12
The Largest Singular Value =  6.305742275616531 p =  0.5 n =  12
The Largest Singular Value =  7.99569761412166 p =  0.7 n =  12
The Largest Singular Value =  10.980442789505467 p =  0.9 n =  12
The Largest Singular Value =  2.2379962667290996 p =  0.1 n =  15
The Largest Singular Value =  5.778670823227578 p =  0.3 n =  15
The Largest Singular Value =  8.090188637280358 p =  0.5 n =  15
The Largest Singular Value =  10.29573791442704 p =  0.7 n =  15
The Largest Singular Value =  13.67635721304295 p =  0.9 n =  15
...
The Largest Singular Value =  19.38949701576099 p =  0.1 n =  186
The Largest Singular Value =  56.94504366449596 p =  0.3 n =  186
The Largest Singular Value =  93.54422459660233 p =  0.5 n =  186
The Largest Singular Value =  130.67481543341682 p =  0.7 n =  186
The Largest Singular Value =  167.09061508238244 p =  0.9 n =  186
The Largest Singular Value =  20.258561128073687 p =  0.1 n =  189
The Largest Singular Value =  57.297048042194696 p =  0.3 n =  189
The Largest Singular Value =  95.11444758467373 p =  0.5 n =  189
The Largest Singular Value =  132.60548423642717 p =  0.7 n =  189
The Largest Singular Value =  170.5014181310536 p =  0.9 n =  189
The Largest Singular Value =  20.05437077493877 p =  0.1 n =  192
The Largest Singular Value =  58.44691193374126 p =  0.3 n =  192
The Largest Singular Value =  96.34102323493846 p =  0.5 n =  192
The Largest Singular Value =  134.81851700881901 p =  0.7 n =  192
The Largest Singular Value =  172.90716981562926 p =  0.9 n =  192
The Largest Singular Value =  20.76229909108876 p =  0.1 n =  195
The Largest Singular Value =  59.52973931863676 p =  0.3 n =  195
The Largest Singular Value =  97.65281068524865 p =  0.5 n =  195
The Largest Singular Value =  136.14601080175393 p =  0.7 n =  195
The Largest Singular Value =  175.9322918907921 p =  0.9 n =  195
The Largest Singular Value =  20.807310921751753 p =  0.1 n =  198
The Largest Singular Value =  59.29171144340913 p =  0.3 n =  198
The Largest Singular Value =  99.26347838770371 p =  0.5 n =  198
The Largest Singular Value =  139.37089190246715 p =  0.7 n =  198
The Largest Singular Value =  178.55971728244972 p =  0.9 n =  198
The Largest Singular Value =  20.502753619976946 p =  0.1 n =  201
The Largest Singular Value =  60.91842036996605 p =  0.3 n =  201
The Largest Singular Value =  100.93781583296915 p =  0.5 n =  201
The Largest Singular Value =  141.38912544670887 p =  0.7 n =  201
The Largest Singular Value =  180.63276426921232 p =  0.9 n =  201
The Largest Singular Value =  21.35418303075927 p =  0.1 n =  204
The Largest Singular Value =  61.94242840864246 p =  0.3 n =  204
The Largest Singular Value =  102.51456169233059 p =  0.5 n =  204
The Largest Singular Value =  142.58482567890835 p =  0.7 n =  204
The Largest Singular Value =  183.98456595092017 p =  0.9 n =  204
The Largest Singular Value =  22.11533217267731 p =  0.1 n =  207
The Largest Singular Value =  62.6086349924835 p =  0.3 n =  207
The Largest Singular Value =  104.01827672327332 p =  0.5 n =  207
The Largest Singular Value =  145.4581721206903 p =  0.7 n =  207
The Largest Singular Value =  187.03528803882207 p =  0.9 n =  207

由结果显示得知,当n较小时,p的改变对Largest Singular Value影响比较小,当n较大时,p越大,Largest Singular Value也越大,并且p的改变对Largest Singular Value影响比较大;当p不变,n增大时,Largest Singular Value也会增大。


Exercise 9.6: Nearest neighbor 

    Write a function that takes a value z and an array A and finds the element in A that is closest to z. The function should return the closest value, not index.

Hint: Use the built-in functionality of Numpy rather than writing code to find this value manually. In particular, use brackets and argmin.

代码:

import numpy as np

def find_nearest_neighbor(value_z,array_A):
    tmp = abs(array_A-value_z)
    value = array_A[np.argmin(tmp)]
    return value

if __name__ == "__main__":
    value_z = np.random.rand()
    array_A = np.random.rand(50)

    print("z = ",value_z)
    print("A = ",array_A)
    print("We can see the nearest neighbor is ",find_nearest_neighbor(value_z,array_A))

输出:

z =  0.6368442631515912
A =  [0.40649133 0.02533991 0.55882556 0.86891874 0.52946213 0.9249992
 0.20037347 0.75057371 0.93168899 0.23463218 0.80935187 0.64473216
 0.40661881 0.66388089 0.62561682 0.24724342 0.05804259 0.17847537
 0.10828185 0.62755381 0.84145733 0.61452277 0.91499793 0.71516597
 0.4478704  0.62753202 0.04412641 0.08322074 0.55919557 0.86540081
 0.69002192 0.20776787 0.78010365 0.19342374 0.73000747 0.94171405
 0.44862776 0.01926229 0.69754189 0.72526034 0.84528182 0.91442855
 0.6519868  0.06088775 0.03545648 0.82967409 0.75913422 0.32334049
 0.49889186 0.23732668]
We can see the nearest neighbor is  0.6447321591878525

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答您的问题。关于利用numpy练习数组的插入和删除,下面是一些参考代码和解释: 1. 插入 在numpy中,可以使用insert()函数来向数组中插入元素。该函数的语法如下: numpy.insert(arr, obj, values, axis=None) 其中,arr是要插入元素的数组;obj是插入位置的下标或下标组成的序列;values是要插入的元素或元素组成的序列;axis是插入的方向,如果指定则必须是0或1。 例如,以下代码向一个一维数组中插入元素: import numpy as np arr = np.array([1, 2, 3, 4]) new_arr = np.insert(arr, 1, 5) print(new_arr) # [1 5 2 3 4] 这个例子中,1表示插入位置的下标,5表示要插入的元素。 如果要向一个二维数组中插入元素,可以指定axis参数: import numpy as np arr = np.array([[1, 2], [3, 4]]) new_arr = np.insert(arr, 1, [5, 6], axis=1) print(new_arr) """ [[1 5 2] [3 6 4]] """ 这里的[5, 6]表示要插入的元素,axis=1表示在第二维(即列)上插入元素。 2. 删除 删除元素可以使用delete()函数。该函数的语法如下: numpy.delete(arr, obj, axis=None) 其中,arr是要删除元素的数组;obj是要删除元素的下标或下标组成的序列;axis是删除的方向,如果指定则必须是0或1。 例如,以下代码从一个一维数组中删除元素: import numpy as np arr = np.array([1, 2, 3, 4]) new_arr = np.delete(arr, 2) print(new_arr) # [1 2 4] 这个例子中,2表示要删除的元素的下标。 如果要从一个二维数组中删除元素,可以指定axis参数: import numpy as np arr = np.array([[1, 2], [3, 4], [5, 6]]) new_arr = np.delete(arr, 1, axis=0) print(new_arr) """ [[1 2] [5 6]] """ 这里的1表示要删除的元素的下标,axis=0表示在第一维(即行)上删除元素。 希望这些代码可以帮助您更好地练习数组的插入和删除。如果您还有其他问题,请继续提出,我会尽力回答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值