线性代数
线性代数,比如矩阵乘法、分解、行列式等方阵数学,是所有数组类库的重要组成部分。和Matlab等其他语言相比,Numpy的线性代数中所不同的是*是矩阵的逐元素乘积,而不是矩阵的点乘积。因此Numpy的数组方法和numpy命名空间中都有一个函数dot,用于矩阵的操作:
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
print(x)
print(y)
#
[[1. 2. 3.]
[4. 5. 6.]]
[[ 6. 23.]
[-1. 7.]
[ 8. 9.]]
x.dot(y)等价于np.dot(x, y)
print(np.dot(x, y))
#
[[ 28. 64.]
[ 67. 181.]]
一个二维数组和一个长度合适的一维数组之间的矩阵乘积,其结果是一个一维数组:
print(np.dot(x, np.ones(3)))
#
[ 6. 15.]
特殊符号@也作为中缀操作符,用于点乘矩阵操作:
print(x @ np.ones(3))
#
[ 6. 15.]
numpy.linalg拥有一个矩阵分解的标准函数集,以及其他常用函数,例如求逆和行列式求解。这些函数都是通过在MATLAB和R等其他语言使用的相同的行业标准线性代数库来实现的,例如BLAS、LAPACK或英特尔专用的MKL(数学核心库)。
diag | 将一个方阵的对角(或非对角)元素作为一维数组返回,或者将一维数组转换成一个方阵,并且在非对角线上有零点 |
dot | 矩阵点乘 |
trace | 计算对角元素和 |
det | 计算矩阵的行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆矩阵 |
pinv | 计算矩阵的Moore-Penrose伪逆 |
qr | 计算QR分解 |
svd | 计算奇异值分解(SVD) |
solve | 求解x的线性系统Ax=b,其中A是方阵 |
lstsq | 计算Ax=b的最小二乘解 |
伪随机数生成
numpy.random模块填补了Python内建的random模块的不足,可以高效地生成多种概率分布下的完整样本值数组。例如,可以使用normal来获得一个4X4的正态分布样布数组:
samples = np.random.normal(size=(4, 4))
print(samples)
#
[[ 0.19126673 1.00933806 1.56623026 0.19216111]
[-1.63528126 -0.3591005 2.11737578 -0.54024645]
[-0.1835273 0.85379703 -0.6074602 -1.40270405]
[-0.21243456 0.13365176 -0.19936023 -1.02825159]]