numpy学习笔记5:线性代数函数及数组对象的文件读写。

数组文件的读写

np.save和np.load函数以numpy内建二进制格式存储和读取数字对象,大部分用户会用pandas或其他工具来存取文本、表格文件。

1
2
3
import numpy as np
arr = np.arange(10)
np.save('some_array', arr) #数组保存到some_array.npy文件中
1
np.load('some_array.npy') #从文件中读取数组
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
np.savez('array_archive.npz', a=arr, b=arr) #使用关键字参数存错多个数组,未压缩格式
1
2
arch = np.load('array_archive.npz') #从npz文件中读取数组数据对象,该对象以类似字典的形式表示
arch['b'] #lazy load数组b
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)  #以压缩格式保存数组

线性代数函数

1
2
x = np.array([[1., 2., 3.], [4., 5., 6.]])
x
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
1
2
y = np.array([[6., 23.], [-1, 7], [8, 9]])
y
array([[  6.,  23.],
       [ -1.,   7.],
       [  8.,   9.]])
1
x.dot(y) #矩阵点乘
array([[  28.,   64.],
       [  67.,  181.]])
1
np.dot(x, y) #全局函数形式
array([[  28.,   64.],
       [  67.,  181.]])
1
np.dot(x, np.ones(3)) #二维数组点乘一维向量
array([  6.,  15.])
1
x @ np.ones(3) #python3.5版本以上,点乘可以以@表示
array([  6.,  15.])

numpy.linalg是numpy线性代数库,包含了常用的线性代数函数

1
2
3
4
from numpy.linalg import inv, qr
X = np.random.randn(5, 5)
mat = X.T.dot(X) #X的转置点乘X
inv(mat) #计算mat矩阵的逆矩阵
array([[  1.31386887,  -6.35141544,   1.88626458,  -6.16060108,
         -1.61105243],
       [ -6.35141544,  45.53241364, -12.64585185,  40.44409478,
         11.13390453],
       [  1.88626458, -12.64585185,   3.93294826, -11.5040055 ,
         -3.15881188],
       [ -6.16060108,  40.44409478, -11.5040055 ,  37.05474997,
          9.82733633],
       [ -1.61105243,  11.13390453,  -3.15881188,   9.82733633,
          2.91712818]])
1
mat.dot(inv(mat))
array([[  1.00000000e+00,  -2.03263834e-14,  -4.44066681e-15,
          6.33434894e-15,   6.35591881e-16],
       [ -2.46609105e-16,   1.00000000e+00,   2.45780426e-15,
          2.92475759e-15,  -4.42834742e-16],
       [ -1.24211599e-15,  -4.02376796e-15,   1.00000000e+00,
          5.88409131e-15,   4.85369671e-16],
       [ -1.82510818e-15,   6.24289242e-16,  -3.48747349e-15,
          1.00000000e+00,   2.50976255e-15],
       [ -1.74634203e-15,  -5.97517012e-15,   2.95250279e-16,
          6.38984296e-15,   1.00000000e+00]])
1
2
q, r = qr(mat) #矩阵的QR分解
r
array([[-8.96390593,  5.04075656, -2.28672019, -5.68262082, -7.65475092],
       [ 0.        , -1.73065451,  1.20032719,  1.07003633,  4.51499433],
       [ 0.        ,  0.        , -3.05481272, -0.64206845, -1.15803315],
       [ 0.        ,  0.        ,  0.        , -0.71357743,  2.62657632],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.06433249]])

如果实(复)非奇异矩阵A能够化成正交(酉)矩阵Q与实(复)非奇异上三角矩阵R的乘积,即A=QR,则称其为A的QR分解。
QR(正交三角)分解法是目前求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。它是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。

常用线性代数函数

函数 描述
diag 返回一个矩阵的对角线元素组成的数组,或者根据一个一维数组产生一个以该数组为对角线的矩阵
dot 矩阵点乘
trace 计算对角线元素的和(矩阵的迹)
det 计算矩阵行列式
eig 计算特征值和特征向量
inv 计算矩阵的逆矩阵
pinv 计算 Moore-Penrose逆矩阵
qr 计算QR分解
svd 计算SVD分解
solve 求方程 Ax = b 中的向量X,A是矩阵
lstsq 计算 Ax = b的最小二乘答案