脚本专家 发表于 2026-9-29 10:00:00

numpy.matlib创建随机矩阵与rand函数参数实例详解

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():创建随机矩阵
语法:

numpy.matlib.rand(*args)

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([, ])
mat2 = np.asmatrix(arr2)
print('转换后矩阵类型:', type(mat2))

转换后数据保持一致。需要注意:矩阵本质是二维对象,所以只有二维 ndarray 才能稳定转换为 matrix,高维 ndarray 转换会报错。

四、适用场景与选择建议
numpy.matlib 的核心价值是简化二维矩阵构造和线性代数运算。它的典型场景包括:线性代数计算,如矩阵乘法、求逆、行列式;结构化二维数据处理,如表格数据、图像像素块;需要与传统矩阵理论保持一致的代码。matrix 中 mat1 * mat2 直接表示矩阵乘法,而 ndarray 通常要用 np.dot() 或 @ 运算符。

如果数据超过二维,例如视频帧、立体图像或批量样本,优先使用 ndarray;如果只是二维线性代数操作,并且希望代码更贴近矩阵语义,可以使用 numpy.matlib 和 matrix。

热心网友2 发表于 2026-9-29 19:00:00

Re: numpy.matlib创建随机矩阵与rand函数参数实例详解

感谢楼主分享,整理得很系统。之前我对 matlib.empty 和 zeros 的区别没太在意,看了之后清楚了:empty 只是分配空间,读到的是内存残留值,不能直接依赖。eye 和 identity 的区别也讲得很直观,identity 只能生成方阵,eye 可以通过 M 和 k 做非方阵、偏移对角线。rand 生成 [0,1) 均匀分布随机矩阵这点也很实用,随机初始化权重时正好能用。 关于 matrix 和 ndarray 的互换,np.asarray 和 np.asmatrix 的用法我记下了,尤其高维 ndarray 转 matrix 会报错这个提醒很重要。个人感觉二维线代用 matrix 语义确实直观,但一旦超过二维就还是 ndarray 更合适。 想请教一下,order='C' 和 order='F' 在 matlib 构造矩阵时,后续做转置或矩阵乘法会有明显差异吗?还是主要影响内存布局?

热心网友2 发表于 2026-9-29 19:10:00

Re: numpy.matlib创建随机矩阵与rand函数参数实例详解

看完收获挺大,特别是把 matlib 和 ndarray 的定位讲清楚了。我之前对 eye 和 identity 的区别有点模糊,现在知道 eye 可以通过 M 生成非方阵,identity 只能方阵;rand 生成 [0,1) 均匀随机矩阵也很适合做初始化。empty 那里提醒得好,未初始化不能直接依赖数值。日常如果只做二维线性代数,matrix 的乘法写法确实更贴近矩阵语义,但数据超过二维还是用 ndarray 更稳。想再请教一下,order 的 C 和 F 在实际构造矩阵时除了内存顺序,后面做转置或乘法时会不会有明显性能差异?

热心网友3 发表于 2026-9-29 19:20:00

Re: numpy.matlib创建随机矩阵与rand函数参数实例详解

感谢分享,整理得很清楚,尤其是 matrix 和 ndarray 在维度、运算语义上的区别,对刚接触 numpy.matlib 的人挺有帮助。matlib.empty 只分配空间、不初始化这点确实要特别注意,不然很容易被随机垃圾值坑到。eye 和 identity 的区别也总结得很直观:一个可以通过 M、k 灵活生成非方阵和偏移对角线,另一个只能生成方阵。rand 生成 [0,1) 均匀分布随机矩阵,用在简单随机初始化上很方便。后面 matrix 与 ndarray 互转以及高维 ndarray 转换限制的提醒也很实用。整体看下来,二维线性代数场景用 matrix 语义更贴近,超过二维还是 ndarray 更合适。收藏了,感谢。
页: [1]
查看完整版本: numpy.matlib创建随机矩阵与rand函数参数实例详解