numpy.matlib 是 NumPy 中专门面向矩阵对象的工具模块,它返回的是 numpy.matrix 类型,而不是 NumPy 默认的 ndarray。matrix 只表示二维结构,行数和列数固定,做线性代数运算时语义更直观;ndarray 支持 n 维数据,默认按元素级运算。两者的数据可以互转,但适用场景不同。
一、矩阵转置:T 属性与 transpose
转置会把 m 行 n 列变成 n 行 m 列,也就是行列互换。matrix 和 ndarray 都可以直接使用 T 属性,语法短,日常更推荐;numpy.transpose() 则是通用转置函数,适合多维数组。
- import numpy as np
- a = np.arange(12).reshape(3, 4)
- print('原数组(3行4列):')
- print(a)
- print('转置数组(4行3列):')
- print(a.T)
复制代码
原数组第 1 行 0,1,2,3 会变成转置数组第 1 列,第 2 行、第 3 行依次变成第 2 列、第 3 列。
二、numpy.matlib 常用矩阵构造函数
matlib 里的构造函数大多接收 shape、dtype、order 这几个参数。shape 必传,整数表示方阵,元组表示行列;dtype 控制元素类型,未指定时通常按 float64 处理;order 控制内存顺序,C 为行优先,F 为列优先。
1. matlib.empty():创建未初始化矩阵
语法:- numpy.matlib.empty(shape, dtype=None, order='C')
复制代码 empty 只分配矩阵空间,不初始化元素,所以读到的值是随机垃圾值,取决于内存当前状态。它适合先占位、后续再手动赋值的场景,不要在赋值前依赖其中数值。
- import numpy.matlib
- import numpy as np
- empty_mat = np.matlib.empty((2, 2))
- print('未初始化矩阵:')
- print(empty_mat)
复制代码 输出每次运行可能不同,可能类似极小浮点数或任意残留值。
2. matlib.zeros() 与 matlib.ones()
zeros 构造全 0 矩阵,ones 构造全 1 矩阵,参数形式与 empty 一致。它们适合需要空白基底、累加计数、统一初始值或掩码基础的场景。- zeros_mat = np.matlib.zeros((2, 2))
- ones_mat = np.matlib.ones((2, 2))
- print('全0矩阵:')
- print(zeros_mat)
- print('全1矩阵:')
- print(ones_mat)
复制代码 输出分别为 2 行 2 列全 0 和全 1。
3. matlib.eye():创建对角为 1 的矩阵,可非方阵
语法:- numpy.matlib.eye(n, M=None, k=0, dtype=float)
复制代码 n 是行数,必传;M 是列数,若为 None 则等于 n,也就是方阵;k 是对角线偏移,k=0 是主对角线,k=1 在主对角线上方,k=-1 在主对角线下方;dtype 默认 float。- eye_mat = np.matlib.eye(n=3, M=4, k=0, dtype=float)
- print('3行4列对角为1的矩阵:')
- print(eye_mat)
复制代码 结果中 (0,0)、(1,1)、(2,2) 位置为 1,其余为 0,因此 eye 可以创建非方阵。
4. matlib.identity():创建单位矩阵,必为方阵
语法:- numpy.matlib.identity(n, dtype=float)
复制代码 n 是矩阵阶数,行数等于列数;dtype 默认 float。单位矩阵是线性代数中的单位元,A×I=A。- identity_mat = np.matlib.identity(5, dtype=float)
- print('5阶单位矩阵:')
- print(identity_mat)
复制代码 identity 与 eye 的区别在于:identity 只能生成方阵,eye 可通过 M 参数生成行数不等于列数的矩阵。
5. matlib.rand():创建随机矩阵
语法:args 直接传入行数和列数,例如 rand(3, 3) 表示 3 行 3 列。矩阵元素是 [0,1) 区间均匀分布的随机数,常用于随机初始化,例如机器学习里的权重初始值。- rand_mat = np.matlib.rand(3, 3)
- print('3行3列随机矩阵:')
- print(rand_mat)
复制代码 每次运行结果不同,元素都在 0 到 1 之间,包含 0 但不包含 1。
三、matrix 与 ndarray 的互换
矩阵和 ndarray 类型不同,但数据内容可以通过 np.asarray() 和 np.asmatrix() 转换。matrix 转 ndarray 用 np.asarray(矩阵);ndarray 转 matrix 用 np.asmatrix(ndarray)。- import numpy.matlib
- import numpy as np
- mat = np.matrix('1,2;3,4')
- print('原矩阵类型:', type(mat))
- arr = np.asarray(mat)
- print('转换后类型:', type(arr))
- arr2 = np.array([[1, 2], [3, 4]])
- mat2 = np.asmatrix(arr2)
- print('转换后矩阵类型:', type(mat2))
复制代码 转换后数据保持一致。需要注意:矩阵本质是二维对象,所以只有二维 ndarray 才能稳定转换为 matrix,高维 ndarray 转换会报错。
四、适用场景与选择建议
numpy.matlib 的核心价值是简化二维矩阵构造和线性代数运算。它的典型场景包括:线性代数计算,如矩阵乘法、求逆、行列式;结构化二维数据处理,如表格数据、图像像素块;需要与传统矩阵理论保持一致的代码。matrix 中 mat1 * mat2 直接表示矩阵乘法,而 ndarray 通常要用 np.dot() 或 @ 运算符。
如果数据超过二维,例如视频帧、立体图像或批量样本,优先使用 ndarray;如果只是二维线性代数操作,并且希望代码更贴近矩阵语义,可以使用 numpy.matlib 和 matrix。 |