NumPy 中 ndarray 和 matrix 的区别

本文概述了 NumPy 中 ndarray 和 matrix 的使用差异和转换方法。示例代码假设已导入 numpy

1. 维数限制

matrix 和 ndarray 所能表示的数据维数不同,matrix 只能表示二维数据,而 ndarray 可以表示 N 维数据。

1.1. matrix

matrix 只能是二维,可以使用如下的方法生成两个 2 * 2 的 matrix:

如果尝试生成多于二维的矩阵,会产生报错:

1.2. ndarray

ndarray 可以是 N 维,如使用如下的方法生成两个 2 * 2 的 ndarray:

可以生成任意维数的 ndarray:

2. 矩阵乘法

matrix 和 ndarray 在进行矩阵乘法时的操作不同。

2.1. matrix

对于 matrix,使用运算符 * 或 NumPy 的 dot() 方法计算矢量积(叉乘),使用NumPy 的 multiply() 方法计算数量积(点乘)。例如对于上面定义的 matrix ab,有:

2.2. ndarray

对于 ndarray,使用 NumPy 或者 ndarray 的 dot() 方法计算矢量积,使用 运算符 * 或 Numpy 的 multiply() 方法计算数量积。例如对于上面定义的 ndarray xy,有:

此外,从 Python 3.5 和 Numpy 1.10 以后,可以使用中缀操作符 @ 计算 ndarray 间的矢量积,写起来更加方便:

3. 转换

3.1. matrix 到 ndarray

可以使用 matrix 的 A 属性或者 NumPy 的 asarray() 方法,将 matrix 转换为 ndarray。如:

注意上面两个转换方法不会复制数据,如果修改了原始 matrix(即 a),则该修改也会反映到转换后的 ndarray(即 de)中,如:

输出为:

3.2. ndarray 到 matrix

可以使用 Numpy 的 asmatrix() 将 ndarray 转换为 matrix。如:

该转换也不会复制数据,如果修改了原始 ndarray(即 x),则该修改也会反映到转换后的 matrix(即 z)中。

4. 如何选择 ndarray 和 matrix

对于 ndarray 和 matrix 的选择,scipy.org 给出的建议是使用 ndarray,因为:

  • They are the standard vector/matrix/tensor type of numpy. Many numpy functions return arrays, not matrices.
  • There is a clear distinction between element-wise operations and linear algebra operations.
  • You can have standard vectors or row/column vectors if you like.