numpy矩阵和数组的区别

2020-04-19  本文已影响0人  ab02f58fd803

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. 更多阅读

  1. [ndarray&matrix](https://numpy.org/devdocs/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i-use

  2. [reference](https://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-i-u

6. 应用-基于最小二乘的线性回归

W^* = (X^TX)^{-1}X^TY

## 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. 注意

本人能力有限,如有问题,欢迎讨论,谢谢

上一篇 下一篇

猜你喜欢

热点阅读