查看: 1116|回复: 3

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

[复制链接]
发表于 昨天 10:00 | 显示全部楼层 |阅读模式
numpy.matlib 是 NumPy 中专门面向矩阵对象的工具模块,它返回的是 numpy.matrix 类型,而不是 NumPy 默认的 ndarray。matrix 只表示二维结构,行数和列数固定,做线性代数运算时语义更直观;ndarray 支持 n 维数据,默认按元素级运算。两者的数据可以互转,但适用场景不同。

一、矩阵转置:T 属性与 transpose
转置会把 m 行 n 列变成 n 行 m 列,也就是行列互换。matrix 和 ndarray 都可以直接使用 T 属性,语法短,日常更推荐;numpy.transpose() 则是通用转置函数,适合多维数组。
  1. import numpy as np
  2. a = np.arange(12).reshape(3, 4)
  3. print('原数组(3行4列):')
  4. print(a)
  5. print('转置数组(4行3列):')
  6. 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():创建未初始化矩阵
语法:
  1. numpy.matlib.empty(shape, dtype=None, order='C')
复制代码
empty 只分配矩阵空间,不初始化元素,所以读到的值是随机垃圾值,取决于内存当前状态。它适合先占位、后续再手动赋值的场景,不要在赋值前依赖其中数值。
  1. import numpy.matlib
  2. import numpy as np
  3. empty_mat = np.matlib.empty((2, 2))
  4. print('未初始化矩阵:')
  5. print(empty_mat)
复制代码
输出每次运行可能不同,可能类似极小浮点数或任意残留值。

2. matlib.zeros() 与 matlib.ones()
zeros 构造全 0 矩阵,ones 构造全 1 矩阵,参数形式与 empty 一致。它们适合需要空白基底、累加计数、统一初始值或掩码基础的场景。
  1. zeros_mat = np.matlib.zeros((2, 2))
  2. ones_mat = np.matlib.ones((2, 2))
  3. print('全0矩阵:')
  4. print(zeros_mat)
  5. print('全1矩阵:')
  6. print(ones_mat)
复制代码
输出分别为 2 行 2 列全 0 和全 1。

3. matlib.eye():创建对角为 1 的矩阵,可非方阵
语法:
  1. numpy.matlib.eye(n, M=None, k=0, dtype=float)
复制代码
n 是行数,必传;M 是列数,若为 None 则等于 n,也就是方阵;k 是对角线偏移,k=0 是主对角线,k=1 在主对角线上方,k=-1 在主对角线下方;dtype 默认 float。
  1. eye_mat = np.matlib.eye(n=3, M=4, k=0, dtype=float)
  2. print('3行4列对角为1的矩阵:')
  3. print(eye_mat)
复制代码
结果中 (0,0)、(1,1)、(2,2) 位置为 1,其余为 0,因此 eye 可以创建非方阵。

4. matlib.identity():创建单位矩阵,必为方阵
语法:
  1. numpy.matlib.identity(n, dtype=float)
复制代码
n 是矩阵阶数,行数等于列数;dtype 默认 float。单位矩阵是线性代数中的单位元,A×I=A。
  1. identity_mat = np.matlib.identity(5, dtype=float)
  2. print('5阶单位矩阵:')
  3. print(identity_mat)
复制代码
identity 与 eye 的区别在于:identity 只能生成方阵,eye 可通过 M 参数生成行数不等于列数的矩阵。

5. matlib.rand():创建随机矩阵
语法:
  1. numpy.matlib.rand(*args)
复制代码
args 直接传入行数和列数,例如 rand(3, 3) 表示 3 行 3 列。矩阵元素是 [0,1) 区间均匀分布的随机数,常用于随机初始化,例如机器学习里的权重初始值。
  1. rand_mat = np.matlib.rand(3, 3)
  2. print('3行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)。
  1. import numpy.matlib
  2. import numpy as np
  3. mat = np.matrix('1,2;3,4')
  4. print('原矩阵类型:', type(mat))
  5. arr = np.asarray(mat)
  6. print('转换后类型:', type(arr))
  7. arr2 = np.array([[1, 2], [3, 4]])
  8. mat2 = np.asmatrix(arr2)
  9. print('转换后矩阵类型:', type(mat2))
复制代码
转换后数据保持一致。需要注意:矩阵本质是二维对象,所以只有二维 ndarray 才能稳定转换为 matrix,高维 ndarray 转换会报错。

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

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

使用道具 举报

发表于 昨天 19: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 构造矩阵时,后续做转置或矩阵乘法会有明显差异吗?还是主要影响内存布局?
回复 支持 反对

使用道具 举报

发表于 昨天 19:10 | 显示全部楼层

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

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

使用道具 举报

发表于 昨天 19:20 | 显示全部楼层

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-30 06:16 , Processed in 0.031357 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部