使用array,而不是matrix

详细原因说明:https://numpy.org/devdocs/user/numpy-for-matlab-users.html#short-answer

操作符

乘法

  • Matlab

标准矩阵相乘,13矩阵和31矩阵相乘得到1*1

  • Numpy

加减乘除操作符都是逐元素运算,因此操作符 *逐元素相乘,13矩阵和31矩阵相乘得到3*3

  1. import numpy as np
  2. a = np.array([[1, 2, 3]])
  3. b = np.array([[4], [5], [6]])
  4. >>> a * b
  5. array([[ 4, 8, 12],
  6. [ 5, 10, 15],
  7. [ 6, 12, 18]])
  8. >>> b * a
  9. array([[ 4, 8, 12],
  10. [ 5, 10, 15],
  11. [ 6, 12, 18]])

@ 操作符

要实现矩阵乘法,需要使用 dot 函数或者操作符 **@**

  1. >>> a.dot(b)
  2. array([[32]])
  3. >>> b.dot(a)
  4. array([[ 4, 8, 12],
  5. [ 5, 10, 15],
  6. [ 6, 12, 18]])
  • 对于array类型的矩阵,矩阵A和向量v的计算会自动转置v
    • A @ v 会把v当作列向量,无论v是行向量还是列向量;
    • v @ A 把v当作行向量,无论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相同,操作符 +- 可正常使用。但是不同类型的矩阵无法进行加减操作

  1. import numpy as np
  2. x = np.array([1])
  3. x.dtype
  4. dtype('int32')
  5. x+=0.5
  6. Traceback (most recent call last):
  7. File "<input>", line 1, in <module>
  8. numpy.core._exceptions.UFuncTypeError: Cannot cast ufunc 'add' output from dtype('float64') to dtype('int32') with casting rule 'same_kind'

稀疏矩阵

MATLAB使用 sparse 构建,Python用 scipy.sparsecsr_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() 函数

  1. >>> m2 = sps.csr_matrix(([3,0], ([2,1], [1,3])), dtype=np.float)
  2. >>> m2.eliminate_zeros()
  3. >>> m2
  4. <3x4 sparse matrix of type '<class 'numpy.float64'>'
  5. with 1 stored elements in Compressed Sparse Row format>
  6. >>> m2.toarray()
  7. array([[ 0., 0., 0., 0.],
  8. [ 0., 0., 0., 0.],
  9. [ 0., 3., 0., 0.]])

如果Python代码执行比Matlab代码慢,可以使用 sparse.csc_matrix 代替 sparse.csr_matrix ,前者是列扫描,后者行扫描。

参考