使用array,而不是matrix
详细原因说明:https://numpy.org/devdocs/user/numpy-for-matlab-users.html#short-answer
操作符
乘法
- Matlab
标准矩阵相乘,13矩阵和31矩阵相乘得到1*1
- Numpy
加减乘除操作符都是逐元素运算,因此操作符 *逐元素相乘,13矩阵和31矩阵相乘得到3*3
import numpy as npa = np.array([[1, 2, 3]])b = np.array([[4], [5], [6]])>>> a * barray([[ 4, 8, 12],[ 5, 10, 15],[ 6, 12, 18]])>>> b * aarray([[ 4, 8, 12],[ 5, 10, 15],[ 6, 12, 18]])
@ 操作符
要实现矩阵乘法,需要使用 dot 函数或者操作符 **@**
>>> a.dot(b)array([[32]])>>> b.dot(a)array([[ 4, 8, 12],[ 5, 10, 15],[ 6, 12, 18]])
- 对于array类型的矩阵,矩阵A和向量v的计算会自动转置v:
A @ v会把v当作列向量,无论v是行向量还是列向量;v @ A把v当作行向量,无论v是行向量还是列向量;
右除与左除
- 符号向右倒就是右除
AB=C ,则 A=C/B 。
矩阵右乘计算:A/B=A*(inv(B))
- 符号向左就是左除
AB=C ,则 B=C\A ;若 B*X=A,则 B\A 为X的解。
矩阵左乘计算: A\B=inv(A)*B
加、减
Numpy与Matlab相同,操作符 + 、 - 可正常使用。但是不同类型的矩阵无法进行加减操作。
import numpy as npx = np.array([1])x.dtypedtype('int32')x+=0.5Traceback (most recent call last):File "<input>", line 1, in <module>numpy.core._exceptions.UFuncTypeError: Cannot cast ufunc 'add' output from dtype('float64') to dtype('int32') with casting rule 'same_kind'
稀疏矩阵
MATLAB使用 sparse 构建,Python用 scipy.sparse 的 csr_matrix 函数构建
三参数构造函数
sparse(i, j, v) 满足S(i(k),j(k)) = v(k),如此得到的就是稀疏矩阵
- Matlab:
sparse(i, j, v) - scipy:
sparse.csr_matrix((v, (i, j))如果要与Matlab完美匹配,必须显性指定为
float的数据格式,并且结果要调用eliminate_zeros()。 要转为array,使用toarray()函数
>>> m2 = sps.csr_matrix(([3,0], ([2,1], [1,3])), dtype=np.float)>>> m2.eliminate_zeros()>>> m2<3x4 sparse matrix of type '<class 'numpy.float64'>'with 1 stored elements in Compressed Sparse Row format>>>> m2.toarray()array([[ 0., 0., 0., 0.],[ 0., 0., 0., 0.],[ 0., 3., 0., 0.]])
如果Python代码执行比Matlab代码慢,可以使用 sparse.csc_matrix 代替 sparse.csr_matrix ,前者是列扫描,后者行扫描。
