• 【python与数据分析】Numpy数值计算基础——补充


    目录

    二、矩阵生成与常用操作

    1.生成矩阵

    2.矩阵转置

    3.查看矩阵特征

    4.矩阵乘法

    5.计算相关系数矩阵

    6.计算方差、协方差、标准差

    7.行列扩展

    8.常用变量

    9.矩阵在不同维度上的计算

    10.应用

    (1)使用蒙特·卡罗方法估计圆周率的值

    (2)复利计算公式

    三、计算特征值与正特征向量

    四、计算逆矩阵

    五、求解线性方程组

    六、计算向量和矩阵的范数

     七、计算矩阵的幂,矩阵自乘

    八、矩阵奇异值分解

    九、计算数组或矩阵的行列式

    十、矩阵QR分解

    十一、读写文件


    二、矩阵生成与常用操作

    1.生成矩阵

    1. >>> import numpy as np
    2. >>> x=np.matrix([[1,2,3],[4,5,6]])
    3. >>> y=np.matrix([1,2,3,4,5,6])
    4. >>> print(x)
    5. [[1 2 3]
    6. [4 5 6]]
    7. >>> print(y)
    8. [[1 2 3 4 5 6]]
    9. >>> x[1] #注意,对矩阵来说,X[1,1]和X[1][1]的含义不一样,后者异常
    10. matrix([[4, 5, 6]])
    11. >>> x[1,1] #X[1,1]返回行下标和列下标都为1的元素
    12. 5
    13. >>> y[0]
    14. matrix([[1, 2, 3, 4, 5, 6]])
    15. >>> y[0,1]
    16. 2

    2.矩阵转置

    1. >>> x
    2. matrix([[1, 2, 3],
    3. [4, 5, 6]])
    4. >>> y
    5. matrix([[1, 2, 3, 4, 5, 6]])
    6. >>> print(x.T,y.T,sep='\n\n')
    7. [[1 4]
    8. [2 5]
    9. [3 6]]
    10. [[1]
    11. [2]
    12. [3]
    13. [4]
    14. [5]
    15. [6]]
    16. >>> x.T
    17. matrix([[1, 4],
    18. [2, 5],
    19. [3, 6]])

    3.查看矩阵特征

    1. >>> x=np.matrix([[1,2,3],[4,5,6]])
    2. >>> print(x.mean(),end='\n====\n') #所有元素平均值
    3. 3.5
    4. ====
    5. >>> print(x.mean(axis=0),end='\n===\n') #纵向平均值
    6. [[2.5 3.5 4.5]]
    7. ===
    8. >>> print(x.mean(axis=0).shape,end='\n====\n')
    9. (1, 3)
    10. ====
    11. >>> print(x.mean(axis=1),end='\n====\n') #横向平均值
    12. [[2.]
    13. [5.]]
    14. ====
    15. >>> print(x.sum(),end='\n====\n') #所有元素之和
    16. 21
    17. ====
    18. >>> print(x.max(axis=1)) #横向最大值
    19. [[3]
    20. [6]]
    21. >>> print(x.argmax(axis=1)) #横向最大值的下标
    22. [[2]
    23. [2]]
    24. >>> print(x.max(axis=0),end='\n====\n') #纵向最大值
    25. [[4 5 6]]
    26. ====
    27. >>> print(x.diagonal(),end='\n====\n') #对角线元素
    28. [[1 5]]
    29. ====
    30. >>> print(x.nonzero()) #非零元素下标,分别返回行下标和列下标
    31. (array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))

    4.矩阵乘法

    1. >>> A=np.matrix([[1,2,3],[4,5,6]])
    2. >>> print(A)
    3. [[1 2 3]
    4. [4 5 6]]
    5. >>> B=np.matrix([[1,2],[3,4],[5,6]])
    6. >>> print(B)
    7. [[1 2]
    8. [3 4]
    9. [5 6]]
    10. >>> C=A*B
    11. >>> print(C)
    12. [[22 28]
    13. [49 64]]
    14. >>> A.shape,B.shape,C.shape
    15. ((2, 3), (3, 2), (2, 2))

    5.计算相关系数矩阵

    • 相关系数矩阵是一个对称矩阵,其中对角线上的元素都是1,表示自相关系数
    • 非对角线元素表示互相关系数,每个元素的绝对值都小于等于1,反应变量变化趋势的相似程度
    • 例如,如果相关系数矩阵中非对角线元素大于0,表示两个信号正相关,其中一个信号变大时另一个信号也变大,变化方向一致,或者说一个信号的变化对另一个信号的影响是正面或者积极的
    • 相关系数的绝对值越大,表示两个信号互相影响的程度越大
    1. >>> print(np.corrcoef([1,2,3,4],[4,3,2,1])) #负相关,变化方向相反
    2. [[ 1. -1.]
    3. [-1. 1.]]
    4. >>> print(np.corrcoef([1,2,3,4],[8,3,2,1])) #负相关,变化方向相反
    5. [[ 1. -0.91350028]
    6. [-0.91350028 1. ]]
    7. >>> print(np.corrcoef([1,2,3,4],[1,2,3,4])) #正相关,变化方向一致
    8. [[1. 1.]
    9. [1. 1.]]
    10. >>> print(np.corrcoef([1,2,3,4],[1,2,3,40])) #正相关,变化趋势接近
    11. [[1. 0.8010362]
    12. [0.8010362 1. ]]

    6.计算方差、协方差、标准差

    1. >>> print(np.cov([1,1,1,1,1])) #方差(自身协方差)
    2. 0.0
    3. >>> print(np.std([1,1,1,1,1])) #标准差
    4. 0.0
    5. >>> print(np.cov([1,2,1,4,1]))
    6. 1.7000000000000002
    7. >>> print(np.std([1,2,1,4,1]))
    8. 1.1661903789690602
    9. >>> x=[-2.1,-1,4.3]
    10. >>> y=[3,1.1,0.12]
    11. >>> X=np.vstack((x,y)) #垂直堆叠矩阵
    12. >>> print(X)
    13. [[-2.1 -1. 4.3 ]
    14. [ 3. 1.1 0.12]]
    15. >>> print(np.cov(X)) #协方差
    16. [[11.71 -4.286 ]
    17. [-4.286 2.14413333]]
    18. >>> print(np.cov(x,y))
    19. [[11.71 -4.286 ]
    20. [-4.286 2.14413333]]
    21. >>> print(np.cov(x))
    22. 11.709999999999999
    23. >>> print(np.cov(y))
    24. 2.1441333333333334
    25. >>> print(np.std(x)) #标准差
    26. 2.794041278626117
    27. >>> print(np.std(x+y)) #同x标准差
    28. 2.2071223094538484
    29. >>> print(np.std(X,axis=1)) #横向标准差,相当于x,y标准差
    30. [2.79404128 1.19558447]
    31. >>> print(np.std(x)) #x标准差方差
    32. 2.794041278626117
    33. >>> print(np.std(X,axis=0))
    34. [2.55 1.05 2.09]

    7.行列扩展

    1. >>>data=np.matrix([np.random.randint(1,10,5) for _ in range(6)])
    2. >>>newcols=np.matrix([np.random.randint(1,10,2) for _ in range(6)])
    3. >>>newrows=np.matrix([np.random.randint(1,10,5) for _ in range(3)])
    4. >>>data
    5. matrix([[4, 5, 8, 1, 1],
    6. [1, 5, 2, 1, 5],
    7. [5, 1, 2, 1, 9],
    8. [6, 1, 6, 6, 7],
    9. [1, 1, 5, 9, 1],
    10. [8, 8, 6, 2, 4]])
    11. >>>newcols
    12. matrix([[4, 2],
    13. [7, 3],
    14. [6, 1],
    15. [1, 1],
    16. [3, 8],
    17. [8, 9]])
    18. >>>newrows
    19. matrix([[4, 1, 3, 5, 7],
    20. [9, 3, 9, 8, 9],
    21. [8, 7, 5, 8, 5]])
    22. >>>np.c_[data,newcols] #在data的右侧(列)加入newcols
    23. matrix([[4, 5, 8, 1, 1, 4, 2],
    24. [1, 5, 2, 1, 5, 7, 3],
    25. [5, 1, 2, 1, 9, 6, 1],
    26. [6, 1, 6, 6, 7, 1, 1],
    27. [1, 1, 5, 9, 1, 3, 8],
    28. [8, 8, 6, 2, 4, 8, 9]])
    29. >>>np.c_[newcols,data] #在data左侧(列)加入newcols
    30. matrix([[4, 2, 4, 5, 8, 1, 1],
    31. [7, 3, 1, 5, 2, 1, 5],
    32. [6, 1, 5, 1, 2, 1, 9],
    33. [1, 1, 6, 1, 6, 6, 7],
    34. [3, 8, 1, 1, 5, 9, 1],
    35. [8, 9, 8, 8, 6, 2, 4]])
    36. >>>np.r_[data,newrows] #在data的下面(行)加入newrows
    37. matrix([[4, 5, 8, 1, 1],
    38. [1, 5, 2, 1, 5],
    39. [5, 1, 2, 1, 9],
    40. [6, 1, 6, 6, 7],
    41. [1, 1, 5, 9, 1],
    42. [8, 8, 6, 2, 4],
    43. [4, 1, 3, 5, 7],
    44. [9, 3, 9, 8, 9],
    45. [8, 7, 5, 8, 5]])
    46. >>>np.r_[newrows,data] #在data的上面(行)加入newrows
    47. matrix([[4, 1, 3, 5, 7],
    48. [9, 3, 9, 8, 9],
    49. [8, 7, 5, 8, 5],
    50. [4, 5, 8, 1, 1],
    51. [1, 5, 2, 1, 5],
    52. [5, 1, 2, 1, 9],
    53. [6, 1, 6, 6, 7],
    54. [1, 1, 5, 9, 1],
    55. [8, 8, 6, 2, 4]])
    56. >>>np.r_[data,newrows,newrows]
    57. matrix([[4, 5, 8, 1, 1],
    58. [1, 5, 2, 1, 5],
    59. [5, 1, 2, 1, 9],
    60. [6, 1, 6, 6, 7],
    61. [1, 1, 5, 9, 1],
    62. [8, 8, 6, 2, 4],
    63. [4, 1, 3, 5, 7],
    64. [9, 3, 9, 8, 9],
    65. [8, 7, 5, 8, 5],
    66. [4, 1, 3, 5, 7],
    67. [9, 3, 9, 8, 9],
    68. [8, 7, 5, 8, 5]])
    69. >>> np.insert(data,0,newrows,axis=0) #在data的第0行插入newrows
    70. matrix([[4, 1, 3, 5, 7],
    71. [9, 3, 9, 8, 9],
    72. [8, 7, 5, 8, 5],
    73. [4, 5, 8, 1, 1],
    74. [1, 5, 2, 1, 5],
    75. [5, 1, 2, 1, 9],
    76. [6, 1, 6, 6, 7],
    77. [1, 1, 5, 9, 1],
    78. [8, 8, 6, 2, 4]])
    79. >>> np.insert(data,3,newrows,axis=0) #在data的第三行插入newrows
    80. matrix([[4, 5, 8, 1, 1],
    81. [1, 5, 2, 1, 5],
    82. [5, 1, 2, 1, 9],
    83. [4, 1, 3, 5, 7],
    84. [9, 3, 9, 8, 9],
    85. [8, 7, 5, 8, 5],
    86. [6, 1, 6, 6, 7],
    87. [1, 1, 5, 9, 1],
    88. [8, 8, 6, 2, 4]])
    89. >>> np.insert(data,4,newcols.T,axis=1) #在data的第四列插入newcols
    90. matrix([[4, 5, 8, 1, 4, 2, 1],
    91. [1, 5, 2, 1, 7, 3, 5],
    92. [5, 1, 2, 1, 6, 1, 9],
    93. [6, 1, 6, 6, 1, 1, 7],
    94. [1, 1, 5, 9, 3, 8, 1],
    95. [8, 8, 6, 2, 8, 9, 4]])
    96. >>> np.insert(data,1,newcols.T,axis=1) #在data的第一列插入newcols
    97. matrix([[4, 4, 2, 5, 8, 1, 1],
    98. [1, 7, 3, 5, 2, 1, 5],
    99. [5, 6, 1, 1, 2, 1, 9],
    100. [6, 1, 1, 1, 6, 6, 7],
    101. [1, 3, 8, 1, 5, 9, 1],
    102. [8, 8, 9, 8, 6, 2, 4]])
    103. >>> np.row_stack((data,newrows)) #垂直(行)堆叠矩阵,与np.vstack((data,newrows))
    104. matrix([[4, 5, 8, 1, 1],
    105. [1, 5, 2, 1, 5],
    106. [5, 1, 2, 1, 9],
    107. [6, 1, 6, 6, 7],
    108. [1, 1, 5, 9, 1],
    109. [8, 8, 6, 2, 4],
    110. [4, 1, 3, 5, 7],
    111. [9, 3, 9, 8, 9],
    112. [8, 7, 5, 8, 5]])
    113. >>> np.column_stack((data,newcols)) #横着(列)堆叠矩阵
    114. matrix([[4, 5, 8, 1, 1, 4, 2],
    115. [1, 5, 2, 1, 5, 7, 3],
    116. [5, 1, 2, 1, 9, 6, 1],
    117. [6, 1, 6, 6, 7, 1, 1],
    118. [1, 1, 5, 9, 1, 3, 8],
    119. [8, 8, 6, 2, 4, 8, 9]])

    8.常用变量

    1. >>> np.Inf #正无穷大
    2. inf
    3. >>> np.NAN #非数字
    4. nan
    5. >>> np.Infinity
    6. inf
    7. >>> np.MAXDIMS
    8. 32
    9. >>> np.NINF #负无穷大
    10. -inf
    11. >>> np.NaN
    12. nan
    13. >>> np.NZERO #负0
    14. -0.0

    9.矩阵在不同维度上的计算

    1. >>> x=np.matrix(np.arange(0,10).reshape(2,5)) #二维矩阵
    2. >>> x
    3. matrix([[0, 1, 2, 3, 4],
    4. [5, 6, 7, 8, 9]])
    5. >>> x.sum() #所有元素之和
    6. 45
    7. >>> x.sum(axis=0) #纵向求和
    8. matrix([[ 5, 7, 9, 11, 13]])
    9. >>> x.sum(axis=1) #横向求和
    10. matrix([[10],
    11. [35]])
    12. >>> x.mean() #平均值
    13. 4.5
    14. >>> x.mean(axis=1)
    15. matrix([[2.],
    16. [7.]])
    17. >>> x.mean(axis=0)
    18. matrix([[2.5, 3.5, 4.5, 5.5, 6.5]])
    19. >>> weight=[0.3,0.7] #权重
    20. >>> np.average(x,axis=0,weights=weight)
    21. matrix([[3.5, 4.5, 5.5, 6.5, 7.5]])
    22. >>> x.max() #所有元素最大值
    23. 9
    24. >>> x.max(axis=0) #纵向最大值
    25. matrix([[5, 6, 7, 8, 9]])
    26. >>> x.max(axis=1) #横向最大值
    27. matrix([[4],
    28. [9]])
    29. >>> x=np.matrix(np.random.randint(0,10,size=(3,3)))
    30. >>> x
    31. matrix([[3, 7, 7],
    32. [7, 0, 9],
    33. [4, 0, 8]])
    34. >>> x.std() #标准差
    35. 3.197221015541813
    36. >>> x.std(axis=1) #横向标准差
    37. matrix([[1.88561808],
    38. [3.8586123 ],
    39. [3.26598632]])
    40. >>> x.std(axis=0) #纵向标准差
    41. matrix([[1.69967317, 3.29983165, 0.81649658]])
    42. >>> x.var(axis=0) #纵向方差
    43. matrix([[ 2.88888889, 10.88888889, 0.66666667]])
    44. >>> x.sort(axis=0) #纵向排序
    45. >>> x
    46. matrix([[3, 0, 7],
    47. [4, 0, 8],
    48. [7, 7, 9]])
    49. >>> x.sort(axis=1) #横向排序
    50. >>> x
    51. matrix([[0, 3, 7],
    52. [0, 4, 8],
    53. [7, 7, 9]])

    10.应用

    (1)使用蒙特·卡罗方法估计圆周率的值

    1. >>> def numpyPI(times):
    2. ... x=np.random.rand(times)
    3. ... y=np.random.rand(times)
    4. ... hits=np.sum(x**2+y**2<=1)
    5. ... pi=hits/times*4
    6. ... return pi
    7. ...
    8. >>> numpyPI(1000000)
    9. 3.143172

    (2)复利计算公式

    1. >>> import numpy_financial as npf
    2. >>> round(npf.fv(0.05,39,-14000,-14000))#每年固定存入14000元,年利率固定为5%,40年后的余额
    3. 1691197

    三、计算特征值与正特征向量

    • 对于n*n方阵A,如果存在标量λ和n维非0向量x,使得Ax=\lambda x成立,哪个称λ是方阵A的一个特征值,x为对应λ的特征向量
    • 从几何意义来讲,矩阵乘以一个向量,是对这个向量进行了一个变换,从一个坐标系变换到另一个坐标系。在变换过程中,向量主要发生旋转和缩放这两种变化。如果矩阵乘以一个向量之后,向量只发生了缩放变化而没有进行旋转,那么这个向量就是该矩阵的特征向量,缩放的比例就是特征值。或者说,特征向量是对数据进行旋转之后理想的坐标轴之一,而特征值则是该坐标轴上的投影或者贡献。特征值越大,表示这个坐标轴对原向量的表达越重要,原向量在这个个坐标轴上的投影越大。一个矩阵的所有特征向量组成了该矩阵的一组基,也就是新坐标中的轴。有个特征值和特征向量之后,向量就可以在另一个坐标系中进行表示。
    1. >>> A=np.array([[1,-3,3],[3,-5,3],[6,-6,4]])
    2. >>> print(A)
    3. [[ 1 -3 3]
    4. [ 3 -5 3]
    5. [ 6 -6 4]]
    6. >>> e,v=np.linalg.eig(A) #特征值与特征向量
    7. >>> print(e)
    8. [ 4.+0.00000000e+00j -2.+1.10465796e-15j -2.-1.10465796e-15j]
    9. >>> print(v)
    10. [[-0.40824829+0.j 0.24400118-0.40702229j 0.24400118+0.40702229j]
    11. [-0.40824829+0.j -0.41621909-0.40702229j -0.41621909+0.40702229j]
    12. [-0.81649658+0.j -0.66022027+0.j -0.66022027-0.j ]]
    13. >>> print(np.linalg.eig)
    14. 0x0000027435CD67A0>
    15. >>> print(np.linalg.eigvals(A))
    16. [ 4.+0.00000000e+00j -2.+1.10465796e-15j -2.-1.10465796e-15j]
    17. >>> print(e*v) #特征值与特征向量的乘积
    18. [[-1.63299316+0.00000000e+00j -0.48800237+8.14044580e-01j
    19. -0.48800237-8.14044580e-01j]
    20. [-1.63299316+0.00000000e+00j 0.83243817+8.14044580e-01j
    21. 0.83243817-8.14044580e-01j]
    22. [-3.26598632+0.00000000e+00j 1.32044054-7.29317578e-16j
    23. 1.32044054+7.29317578e-16j]]
    24. >>> print(np.isclose(np.dot(A,v),e*v)) #检验二者是否相等
    25. [[ True True True]
    26. [ True True True]
    27. [ True True True]]
    28. >>> print(np.linalg.det(A-np.eye(3,3)*e)) #行列式|A-λE|的值应为0
    29. 5.965152994198125e-14j

    四、计算逆矩阵

    1. >>> x=np.matrix([[1,2,3],[4,5,6],[7,8,0]])
    2. >>> y=np.linalg.inv(x) #计算x逆矩阵
    3. >>> print(y)
    4. [[-1.77777778 0.88888889 -0.11111111]
    5. [ 1.55555556 -0.77777778 0.22222222]
    6. [-0.11111111 0.22222222 -0.11111111]]
    7. >>> print(x*y) #对角元素为1,其他元素为0或者近似为0
    8. [[ 1.00000000e+00 5.55111512e-17 1.38777878e-17]
    9. [ 5.55111512e-17 1.00000000e+00 2.77555756e-17]
    10. [ 1.77635684e-15 -8.88178420e-16 1.00000000e+00]]
    11. >>> print(np.round(y*x))
    12. [[ 1. -0. 0.]
    13. [ 0. 1. 0.]
    14. [ 0. 0. 1.]]

    五、求解线性方程组

    • 线性方程组\left\{\begin{matrix} a_{11}x_{1}+a_{12}x_{2}+\cdots+a_{1n}x_{n}=b_{1}\\ a_{21}x_{1}+a_{22}x_{2}+\cdots+a_{2n}x_{n}=b_{2}\\ \cdots \\ a_{n1}x_{1}+a_{n2}x_{2}+\cdots+a_{nn}x_{n}=b_{n} \end{matrix}\right.
    • ax=b(a:n*n;x:n*1;b:n*1)
    1. >>> a=np.array([[3,1],[1,2]]) #系数矩阵
    2. >>> b=np.array([9,8])
    3. >>> x=np.linalg.solve(a,b) #求解
    4. >>> print(x)
    5. [2. 3.]
    6. >>> print(np.dot(a,x)) #验证
    7. [9. 8.]
    8. >>> print(np.linalg.lstsq(a,b)) #最小二乘解(返回解、余项、a的秩、a的奇异值)
    9. Warning (from warnings module):
    10. File "", line 1
    11. FutureWarning: `rcond` parameter will change to the default of machine precision times ``max(M, N)`` where M and N are the input matrix dimensions.
    12. To use the future default and silence this warning we advise to pass `rcond=None`, to keep using the old, explicitly pass `rcond=-1`.
    13. (array([2., 3.]), array([], dtype=float64), 2, array([3.61803399, 1.38196601]))
    14. >>> print(np.linalg.matrix_rank(a)) #a的秩
    15. 2
    16. >>> U,sv,V=np.linalg.svd(a,full_matrices=False) #奇异值分解
    17. >>> print(sv) #a的奇异值
    18. [3.61803399 1.38196601]
    19. >>> print(U)
    20. [[-0.85065081 -0.52573111]
    21. [-0.52573111 0.85065081]]
    22. >>> print(V)
    23. [[-0.85065081 -0.52573111]
    24. [-0.52573111 0.85065081]]

    六、计算向量和矩阵的范数

    1. >>> x=np.matrix([[1,2],[3,-4]])
    2. >>> np.linalg.norm(x) #F范数=(1**2+2**2+3**2+(-4)**2)**0.5
    3. 5.477225575051661
    4. >>> np.linalg.norm(x,-2) #smallest singular value
    5. 1.9543950758485487
    6. >>> np.linalg.norm(x,-1) #min(sum(abs(x),axis=0))
    7. 4.0
    8. >>> np.linalg.norm(x,1) #max(sum(abs(x),axis=0))
    9. 6.0
    10. >>> np.linalg.norm(np.array([1,2,3,4]),3)
    11. 4.641588833612778

     七、计算矩阵的幂,矩阵自乘

    1. >>> np.linalg.matrix_power([[1,2],[3,4]],2) #自乘2次
    2. array([[ 7, 10],
    3. [15, 22]])
    4. >>> np.linalg.matrix_power([[1,2],[3,4]],5) #自乘5次
    5. array([[1069, 1558],
    6. [2337, 3406]])
    7. >>> x=np.matrix([[1,2],[3,4]])
    8. >>> x**2 #也可以直接使用运算符**
    9. matrix([[ 7, 10],
    10. [15, 22]])
    11. >>> x**5
    12. matrix([[1069, 1558],
    13. [2337, 3406]])

    八、矩阵奇异值分解

    • A=U\Sigma V^{T},V:n*n;U:m*m;\Sigma :m*n
    • 其中,A,U都是正交阵,Σ是对角阵
    1. >>> a=np.arange(60).reshape(5,-1)
    2. >>> a
    3. array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    4. [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
    5. [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
    6. [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47],
    7. [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59]])
    8. >>> U,s,V=np.linalg.svd(a,full_matrices=False)
    9. >>> np.dot(U,np.dot(np.diag(s),V))
    10. array([[2.32096525e-15, 1.00000000e+00, 2.00000000e+00, 3.00000000e+00,
    11. 4.00000000e+00, 5.00000000e+00, 6.00000000e+00, 7.00000000e+00,
    12. 8.00000000e+00, 9.00000000e+00, 1.00000000e+01, 1.10000000e+01],
    13. [1.20000000e+01, 1.30000000e+01, 1.40000000e+01, 1.50000000e+01,
    14. 1.60000000e+01, 1.70000000e+01, 1.80000000e+01, 1.90000000e+01,
    15. 2.00000000e+01, 2.10000000e+01, 2.20000000e+01, 2.30000000e+01],
    16. [2.40000000e+01, 2.50000000e+01, 2.60000000e+01, 2.70000000e+01,
    17. 2.80000000e+01, 2.90000000e+01, 3.00000000e+01, 3.10000000e+01,
    18. 3.20000000e+01, 3.30000000e+01, 3.40000000e+01, 3.50000000e+01],
    19. [3.60000000e+01, 3.70000000e+01, 3.80000000e+01, 3.90000000e+01,
    20. 4.00000000e+01, 4.10000000e+01, 4.20000000e+01, 4.30000000e+01,
    21. 4.40000000e+01, 4.50000000e+01, 4.60000000e+01, 4.70000000e+01],
    22. [4.80000000e+01, 4.90000000e+01, 5.00000000e+01, 5.10000000e+01,
    23. 5.20000000e+01, 5.30000000e+01, 5.40000000e+01, 5.50000000e+01,
    24. 5.60000000e+01, 5.70000000e+01, 5.80000000e+01, 5.90000000e+01]])
    25. >>> np.allclose(a,np.dot(U,np.dot(np.diag(s),V)))
    26. True

    九、计算数组或矩阵的行列式

    1. >>> a=[[1,2],[3,4]]
    2. >>> np.linalg.det(a)
    3. -2.0000000000000004
    4. >>> a=np.array([[[1,2],[3,4]],[[1,2],[2,1]],[[1,3],[3,1]]])
    5. >>> np.linalg.det(a)
    6. array([-2., -3., -8.])

    十、矩阵QR分解

    • 如果实(复)非奇异矩阵A能够化成正交(酉)矩阵Q与实(复)非奇异上三角矩阵R的乘积,即A=QR,则称其为A的QR分解
    1. >>> a=np.matrix([[1,2,3],[4,5,6]])
    2. >>> q,r=np.linalg.qr(a)
    3. >>> print(q,r,sep='\n\n')
    4. [[-0.24253563 -0.9701425 ]
    5. [-0.9701425 0.24253563]]
    6. [[-4.12310563 -5.33578375 -6.54846188]
    7. [ 0. -0.72760688 -1.45521375]]
    8. >>> np.dot(1,r)
    9. matrix([[-4.12310563, -5.33578375, -6.54846188],
    10. [ 0. , -0.72760688, -1.45521375]])

    十一、读写文件

            numpy文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式

    • save函数是以二进制的格式保存数据。

    np.save("../tmp/save_arr",arr)

    • load函数是从二进制的文件中读取数据

    np.load("../tmp/save_arr.npy")

    • savez函数可以将多个数组保存到一个文件中

    np.savez('../tmp/savez_arr',arr1,arr2)

    • 存储时可以省略扩展名,但读取时不能省略扩展名

            读取文本格式的数据

    • savetxt函数是将数组写到某种分隔符隔开的文本文件中

    np.savetxt("../tmp/arr.txt",arr,fmt="%d",delimiter=",")

    • loadtxt函数执行的是把文件加载到一个二维数组中

    np.loadtxt("../tmp/arr.txt",delimiter=",")

    •  genfromtxt函数面向的是结构化数组和缺失数据

    np.genfromtxt("../tmp/arr.txt",delimiter=",")

    1. >>> x=np.random.rand(4,10)
    2. >>> np.save('data.npy',x)
    3. >>> y=np.load('data.npy')
    4. >>> y
    5. array([[0.41902235, 0.69427069, 0.37598648, 0.73763434, 0.37021849,
    6. 0.22994088, 0.89334764, 0.04995869, 0.18538797, 0.84465261],
    7. [0.97907058, 0.27427357, 0.11774563, 0.90859496, 0.86412135,
    8. 0.643867 , 0.09459659, 0.1766268 , 0.2050061 , 0.82050625],
    9. [0.89201862, 0.64940355, 0.50761076, 0.79521352, 0.52232466,
    10. 0.85287866, 0.91648536, 0.75976614, 0.2113207 , 0.07295113],
    11. [0.41439073, 0.07900488, 0.52060863, 0.92372387, 0.88509664,
    12. 0.50123086, 0.8048252 , 0.38571732, 0.01780673, 0.87969947]])
    13. >>> x=np.matrix([[1,2,3],[4,5,6]])
    14. >>> x
    15. matrix([[1, 2, 3],
    16. [4, 5, 6]])
    17. >>> np.savetxt('x.txt',x)
    18. >>> np.loadtxt('x.txt')
    19. array([[1., 2., 3.],
    20. [4., 5., 6.]])
    21. >>> with open('x.txt') as fp:
    22. ... print(fp.read())
    23. ...
    24. ...
    25. 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
    26. 4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00
    27. >>> a_mat=np.matrix([3,5,7])
    28. >>> a_mat.tostring()
    29. Warning (from warnings module):
    30. File "", line 1
    31. DeprecationWarning: tostring() is deprecated. Use tobytes() instead.
    32. b'\x03\x00\x00\x00\x05\x00\x00\x00\x07\x00\x00\x00'
    33. >>> a_mat.dumps() #dumps()方法用于将数据进行序列化
    34. b'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nmatrix\nq\x01K\x00\x85q\x02c_codecs\nencode\nq\x03X\x01\x00\x00\x00bq\x04X\x06\x00\x00\x00latin1q\x05\x86q\x06Rq\x07\x87q\x08Rq\t(K\x01K\x01K\x03\x86q\ncnumpy\ndtype\nq\x0bX\x02\x00\x00\x00i4q\x0c\x89\x88\x87q\rRq\x0e(K\x03X\x01\x00\x00\x00
    35. >>> np.loads(_) #loads()方法用于反序列化,还原为原来的信息
    36. Traceback (most recent call last):
    37. File "", line 1, in
    38. np.loads(_)
    39. File "E:\python 3.7\lib\site-packages\numpy\__init__.py", line 311, in __getattr__
    40. raise AttributeError("module {!r} has no attribute "
    41. AttributeError: module 'numpy' has no attribute 'loads'. Did you mean: 'load'?
    42. >>> a_mat.dump('x.dat')
    43. >>> np.load('x.dat')
    44. Traceback (most recent call last):
    45. File "", line 1, in
    46. np.load('x.dat')
    47. File "E:\python 3.7\lib\site-packages\numpy\lib\npyio.py", line 418, in load
    48. raise ValueError("Cannot load file containing pickled data "
    49. ValueError: Cannot load file containing pickled data when allow_pickle=False

  • 相关阅读:
    Dubbo3应用开发—Dubbo3注册中心(zookeeper、nacos、consul)的使用
    Unity中RampTex介绍和应用: 溶解特效优化
    JavaWeb(Servlet的原理 配置 生命周期 创建 idea代码模板修改)
    【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
    数模3—Matlab线性规划、非线性规划、多目标规划(超全解法合集)
    电影《名侦探柯南:万圣节的新娘》观后感
    信号与线性系统分析(吴大正,郭宝龙)(2-冲激函数)
    【概率论基础进阶】随机变量及其分布-随机变量及其分布函数
    七个合法学习黑客技术的网站,让你从萌新成为大佬
    Spring事务源码解读
  • 原文地址:https://blog.csdn.net/m0_72318954/article/details/127933211