python中ndarray和matrix
1. 定义ndarray和matrix
from numpy import * a = mat([[1,2],[3,4]]) b = mat([[5,6],[7,8]]) c = array([1,2],[3,4]) d = array([5,6],[7,8])
看看输出他们会不会有什么区别
print(a) print(c) >>[[1 2] [3 4]] [[1 2] [3 4]] #发现输出的matrix和array是一模一样的
print(type(a)) print(type(c)) >> <class 'numpy.matrix'> <class 'numpy.ndarray'>
2. ndarray可以是任意维数,matrix只能是2维
A = array([[[1,2]]]) #正常不报错 B = mat([[[1,2]]]) #报错 >>ValueError: matrix must be 2-dimensional
3. 乘法
3.1 ndarray
3.1.1 叉乘
print(c) print(d) print(np.dot(c,d)) >>[[1 2] [3 4]] [[5 6] [7 8]] [[19 22] [43 50]] #可以看出ndarray也可以像矩阵一样进行叉乘,但需要满足矩阵叉乘的条件(第一个矩阵的列数等于第二个矩阵的行数)
3.1.2 普通乘法
print(c) print(d) print(c*d) >>[[1 2] [3 4]] [[5 6] [7 8]] [[ 5 12] [21 32]] #普通乘法是对应位置元素相乘
3.2 matrix
3.2.1 叉乘
print(a) print(b) print(np.dot(a,b)) >>[[1 2] [3 4]] [[5 6] [7 8]] [[19 22] [43 50]] #矩阵叉乘
3.2.2 普通乘法
print(a) print(b) print(a*b) >>[[1 2] [3 4]] [[5 6] [7 8]] [[19 22] [43 50]] #这里发现对于矩阵运算符"*"直接对应的是叉乘,和np.dot()效果相同
print(a) print(b) print(np.multiply(a,b)) >>[[1 2] [3 4]] [[5 6] [7 8]] [[ 5 12] [21 32]] #如果非要对矩阵进行普通乘法,可以通过np.multiply()实现
那么ndarray和matrix能否混合做乘法呢,结果是点乘还是叉乘呢?
print(a) print(b) print(a*d) >>[[1 2] [3 4]] [[5 6] [7 8]] [[19 22] [43 50]] #可以对matrix和ndarray进行混合乘法,这里的运算符"*"是叉乘
当然啦也可以通过np.multiply()对matrix和ndarray进行点乘
print(a) print(b) print(np.multiply(a,d)) >>[[1 2] [3 4]] [[5 6] [7 8]] [[ 5 12] [21 32]]
4. ndarray和matrix互相转换
4.1 matrix → ndarray
使用matrix对象的A属性或者np.asarray()方法
e = a.A f = np.asarray(a) print(type(e)) print(e) print(type(f)) print(f) >><class 'numpy.ndarray'> [[1 2] [3 4]] <class 'numpy.ndarray'> [[1 2] [3 4]] #这两种方法都可以将matrix转化为ndarray
但是需要注意注意通过转化得到的ndarray(在这里是e和f)和原始matrix(这里是a)共享内存空间,修改了a之后e和f的值也会被修改
a[1,1] = 2 print(e) print(f) >>[[1 2] [3 2]] [[1 2] [3 2]] #在修改了a中元素的值后e,f的值都随之改变
当然了,在改变e或f的值后,a的值也会随之改变
e[1,1] = 3 print(a) >>[[1 2] [3 3]]
4.2 ndarray → matrix
使用np.asmatrix()方法
e = np.asmatrix(c) print(e) >>[[1 2] [3 4]]
同样的,通过转化得到的matrix和原始ndarray共享内存空间
5. ndarray和matrix的其他区别
5.1 matrix更多的操作方法
matrix 和 array 都可以通过objects后面加.T 得到其转置。但是 matrix objects 还可以在后面加 .H f得到共轭矩阵, 加 .I 得到逆矩阵。
5.2 **运算符
** 运算符的作用也不一样 :因为a是个matrix,所以a**2返回的是a*a,相当于矩阵相乘。而c是array,c**2相当于,c中的元素逐个求平方
5.3 matrix维数总保持2维
ndarray与matrix的最大的不同是,在做归约运算时,ndarray的维数会发生变化,但matrix总是保持为2维。例如下面求对行求平均值的运算
print("matrix") print(a) print(a.mean(1)) print("ndarray") print(c) print(c.mean(1)) >>matrix [[1 2] [3 4]] [[1.5] [3.5]] ndarray [[1 2] [3 4]] [1.5 3.5]