numpy矩阵和数组的区别
numpy矩阵(matrix)是严格二维的,而numpy数组(ndarray)是N维 。矩阵对象是ndarray的子类。因此它继承了ndarray的所有属性和方法。
1. numpy矩阵的主要优点
[numpy矩阵](https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html)
它可以为线性代数的矩阵运算提供方便的表示法,
例如,如果a和b是矩阵,则“ a * b”是它们的矩阵乘积,“ a.T”是它的转置矩阵。
2. numpy数组的主要优点
[numpy数组](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html)
它可以是多个二维矩阵,例如,对于CNN来说非常方便。
3. 比较代码
import numpy as np
a = [[1,2], [3,4]]
b = [[1,2], [1,2]]
aArr = np.array(a)
bArr = np.array(b)
print('the type of aArr is {}'.format(type(aArr)))
aMat = np.mat(a)
bMat = np.mat(b)
print('the type of aMat is {}'.format(type(aMat)))
3.1. 转换
结论
1.使用np.mat()和np.array()更方便。
2.对于矩阵,我们还可以将aMat.A和aMat.A1用于ndarray对象和扁平化的ndarray。
## ndarray to matrix
aMat_temp = np.asmatrix(aArr)
print('the type of aMat_temp is {}'.format(type(aMat_temp)))
## or it is ok
aMat_temp = np.mat(aArr)
print('the type of aMat_temp is {}'.format(type(aMat_temp)))
## matrix to ndarray
aArr_temp = np.asarray(aMat)
print('the type of aMat_temp is {}'.format(type(aArr_temp)))
## or it is ok
aArr_temp = np.array(aMat)
print('the type of aMat_temp is {}'.format(type(aArr_temp)))
aArr_temp = aMat.A
print(aArr_temp)
print('the type of aMat_temp is {}'.format(type(aArr_temp)))
3.2. 转置
结论
1.将aMat.T用于矩阵,并将np.transpose(aArr)用于ndarray。
2.但是,np.transpose()对于N维具有更有用的功能。
## for matrix
aMat_T = aMat.T
print('the aMat is \n{}'.format(aMat))
print('the aMat transpose is \n{}'.format(aMat_T))
## for ndarray, use the function np.transpose() it's ok
aArr_T = np.transpose(aArr)
print('the aArr is \n{}'.format(aArr))
print('the aArr transpose is \n{}'.format(aArr_T))
3.3. 逆
对于线性代数来说,这是一个非常重要的概念,比如,它用于基于最小二乘法的线性回归中。
结论
1.将aMat.I用于矩阵,并将np.linalg.inv(aArr)用于ndarray。
2.但是,np.linalg.pinv()用于奇异矩阵求伪逆。
#### it is for invertible matrix
## for matrix
aMat_I = aMat.I
print('the aMat is \n{}'.format(aMat))
print('the aMat inverse is \n{}'.format(aMat_I))
## for ndarray, use the function np.linalg.inv() ,it's ok
aArr_I = np.linalg.inv(aArr)
print('the aArr is \n{}'.format(aArr))
print('the aArr transpose is \n{}'.format(aArr_I))
#### it is for singular matrix, it is wrong
# ## for matrix
# bMat_I = bMat.I
# print('the aMat is \n{}'.format(bMat))
# print('the aMat inverse is \n{}'.format(bMat_I))
# ## for ndarray, use the function np.linalg.inv() ,it's also wrong for singular matrix
# aArr_I = np.linalg.inv(bArr)
# print('the aArr is \n{}'.format(bArr))
# print('the aArr transpose is \n{}'.format(bArr_I))
## for ndarray, use the function np.linalg.pinv() ,it's also wrong for singular matrix
## pseudo-inverse for singular matrix,Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.
bArr_I = np.linalg.pinv(bArr)
print('the aArr is \n{}'.format(bArr))
print('the aArr transpose is \n{}'.format(bArr_I))
3.4. 乘法
结论
1.将aMat * bMat用于矩阵,并将np.dot(aArr)用于ndarray。
## for matrix
matMul = aMat*bMat
print('the aMat is \n{}'.format(aMat))
print('the bMat is \n{}'.format(bMat))
print('the aMat bMat multiplication is \n{}'.format(matMul))
## for ndarray, use the function np.dot() ,it's ok
arrMul = np.dot(aArr, bArr)
arrMul = aArr.dot(bArr)
print('the aArr is \n{}'.format(aArr))
print('the bArr is \n{}'.format(bArr))
print('the aArr bArr multiplication is \n{}'.format(arrMul))
3.5. 乘方
结论
1.将aMat * bMat用于矩阵,并将np.dot(aArr)用于ndarray。
## for matrix
matPow = aMat**2
print('the aMat is \n{}'.format(aMat))
print('the aMat power is \n{}'.format(matPow))
## for ndarray, use the function np.dot() ,it's ok
arrPow = aArr.dot(aArr)
print('the aArr is \n{}'.format(aArr))
print('the aArr power is \n{}'.format(arrPow))
4. ndarray:按元素操作
## for multiplication
## ``*`` means element-wise multiplication, while ``@`` means matrix multiplication
print('aArr is \n{}'.format(aArr))
print('bArr is \n{}'.format(bArr))
print('element-wise multiplication is \n {}'.format(aArr*bArr))
print('matrix multiplication is \n {}'.format(aArr@bArr))
5. 更多阅读
[ndarray&matrix](https://numpy.org/devdocs/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i-use)
6. 应用-基于最小二乘的线性回归
## for matrix
def OLS(X, y):
"""X is (sample size, feature), y is column vector"""
X,y = np.mat(X), np.mat(y).T
X_T = X.T
w = (X_T*X).I * X_T * y
return np.array(w)
## for ndarray
def OLS(X, y):
"""X is (sample size, feature), y is column vector"""
y = y.reshape(-1,1)
X_T = np.transpose(X)
temp = np.dot(X_T, X)
temp_inv = np.linalg.pinv(temp)
temp = np.dot(temp, temp_inv)
return np.dot(temp, y)
7. 注意
本人能力有限,如有问题,欢迎讨论,谢谢