Python用NumPy创建矩阵的几种常用方法
详细讲解在Python中使用NumPy创建二维矩阵的五种常用方法,涵盖从列表转换、固定值占位、单位与对角矩阵、序列重塑到随机矩阵生成,并深入解析ndarray选型要点与dtype机制。
一、基于已有数据结构创建矩阵:np.array()
当数据已经在Python原生列表(List)或元组中准备完毕时,调用 np.array() 是最直接的方式。只需传入嵌套列表,其中外层列表代表矩阵的行(Row),内层列表代表列(Column)。
import numpy as np
# 传入包含两个子列表的二维列表,构建 2 行 3 列的矩阵
matrix_a = np.array([
[1, 2, 3],
[4, 5, 6]
], dtype=np.int32)
print("矩阵内容:\n", matrix_a)
print("形状 (shape):", matrix_a.shape)
print("维度 (ndim):", matrix_a.ndim)
print("元素类型 (dtype):", matrix_a.dtype)
[[1 2 3]
[4 5 6]]
形状 (shape): (2, 3)
维度 (ndim): 2
元素类型 (dtype): int32
使用该方法时,需要特别注意内层列表长度一致性。如果子列表长度不一致(例如一行有3个元素,另一行有2个元素),较新版本的NumPy会直接抛出 ValueError,禁止构建不规则的不齐整数组。
二、使用固定值与占位函数创建矩阵
在很多数值算法中,我们需要在开始迭代前提前分配好矩阵的内存空间,或者填充特定的初始常数。NumPy提供了 np.zeros()、np.ones() 以及 np.full() 三个主要函数。
1. 全零与全一矩阵
创建矩阵时,传入的首个参数为一个包含行数和列数的元组 (rows, cols)。若不显式指定 dtype,NumPy默认会将其设为双精度浮点数(float64)。
# 创建 3 行 4 列的全 0 浮点型矩阵
zeros_mat = np.zeros((3, 4))
# 创建 2 行 3 列的全 1 整型矩阵
ones_mat = np.ones((2, 3), dtype=int)
print("全零矩阵:\n", zeros_mat)
print("全一矩阵:\n", ones_mat)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
全一矩阵:
[[1 1 1]
[1 1 1]]
2. 填充指定常数的矩阵
如果矩阵需要全填充某个非0、非1的特定数值(例如将所有权重初始化为0.5或将缺失值填充为特定标记值),可以直接使用 np.full(),避免了“先全1再逐元素相乘”的多余计算开销。
# 创建 2 行 4 列,数值全部为 7.5 的矩阵
full_mat = np.full((2, 4), fill_value=7.5)
print("全常数矩阵:\n", full_mat)
[[7.5 7.5 7.5 7.5]
[7.5 7.5 7.5 7.5]]
三、构建单位矩阵与对角矩阵:np.eye() 与 np.diag()
在涉及线性代数运算(例如线性方程组求解、正规化矩阵加权或坐标变换)时,单位矩阵和对角矩阵是使用频率极高的基础结构。
1. np.eye() 与 np.identity()
np.identity(n) 只能生成严格的 \(n \times n\) 方形单位矩阵;而 np.eye(N, M=None, k=0) 更加通用,不仅支持创建 \(N \times M\) 的矩形矩阵,还可以通过参数 k 自由调整对角线的偏移量(k>0 为上对角线,k<0 为下对角线)。
# 创建 3x3 标准单位矩阵
eye_std = np.eye(3)
# 创建 3 行 4 列,主对角线向上偏移 1 位的矩阵
eye_offset = np.eye(3, 4, k=1)
print("标准单位矩阵:\n", eye_std)
print("偏移对角矩阵 (k=1):\n", eye_offset)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
偏移对角矩阵 (k=1):
[[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
2. np.diag() 的双向功能
np.diag() 的行为取决于输入数据的维度:
- 如果传入一维数组或列表,它会以该序列作为对角线,生成对应的二维对角矩阵;
- 如果传入二维矩阵,它会反向提取出该矩阵的主对角线元素,返回一维数组。
# 传入 1D 数组 -> 构建 2D 对角矩阵
diag_matrix = np.diag([10, 20, 30])
print("构建的对角矩阵:\n", diag_matrix)
# 传入 2D 矩阵 -> 提取主对角线
extracted = np.diag(diag_matrix)
print("提取的对角线向量:", extracted)
[[10 0 0]
[ 0 20 0]
[ 0 0 30]]
提取的对角线向量: [10 20 30]
四、基于数值序列生成并重塑形状:arange/linspace + reshape()
当需要生成有数学递增规律或在某个区间内均匀采样的矩阵时,最常见的模式是“先生成一维有序序列,再重塑维度为二维矩阵”。
1. np.arange() 配合 reshape
np.arange(start, stop, step) 生成类似原生 range 的左闭右开数组。调用 .reshape(rows, cols) 可以将其重组为任意行列尺寸的矩阵。
# 生成从 0 到 11 的 12 个整数,并重塑为 3 行 4 列的矩阵
grid_a = np.arange(12).reshape((3, 4))
print("3x4 递增矩阵:\n", grid_a)
# 利用 -1 让 NumPy 自动推导列数(只要元素总数能够整除)
grid_b = np.arange(12).reshape((4, -1))
print("4 行自动推导列数矩阵:\n", grid_b)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
4 行自动推导列数矩阵:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
rows × cols。否则会触发 ValueError: cannot reshape array of size X into shape (Y, Z) 错误。同时,通过 reshape 得到的新矩阵通常是原数组的视图(View),两者共享底层内存缓冲区,修改其一会直接同步到另一个。
2. np.linspace() 配合 reshape
当关注的是数值的均匀分布而非固定步长时,应使用 np.linspace(start, stop, num)。它生成在指定闭区间内严格等间距划分的浮点数序列,随后通过 .reshape() 构建网格矩阵。
# 在 0 到 1 之间等间距生成 6 个点,重塑为 2x3 矩阵
lin_matrix = np.linspace(0, 1, 6).reshape((2, 3))
print("等间距采样矩阵:\n", lin_matrix)
[[0. 0.2 0.4]
[0.6 0.8 1. ]]
五、生成随机数矩阵:现代 Generator 接口
在机器学习参数初始化、模拟仿真或算法性能压测时,随机矩阵是不可或缺的。NumPy在1.17版本之后,官方全面推荐使用 np.random.default_rng() 实例化生成器,相较于传统的全局 np.random.rand(),具备更好的统计学性质和线程安全性。
# 创建独立的随机数生成器实例(可传入种子保证结果可复现)
rng = np.random.default_rng(seed=42)
# 1. 均匀分布 [0.0, 1.0) 浮点数矩阵 (2行3列)
rand_uniform = rng.random(size=(2, 3))
# 2. 离散整数均匀分布 [10, 50) 矩阵 (3行3列)
rand_integers = rng.integers(low=10, high=50, size=(3, 3))
# 3. 标准正态分布 (均值0, 方差1) 矩阵 (2行2列)
rand_normal = rng.standard_normal(size=(2, 2))
print("均匀随机矩阵:\n", np.round(rand_uniform, 3))
print("随机整数矩阵:\n", rand_integers)
print("正态分布矩阵:\n", np.round(rand_normal, 3))
[[0.774 0.439 0.859]
[0.697 0.095 0.976]]
随机整数矩阵:
[[24 45 47]
[28 17 38]
[26 23 20]]
正态分布矩阵:
[[-0.641 -0.066]
[-0.315 -0.375]]
六、关键辨析:为什么推荐 2D ndarray 而不是 np.matrix?
很多刚接触NumPy的读者在文档或旧教材中会发现 np.matrix() 或 np.mat() 类。读者需要明确:NumPy官方已明确弃用 np.matrix,推荐统一使用二维 ndarray。
两者的关键差异集中在算符重载和切片维度保持上:
# 二维 ndarray 的标准矩阵乘法演练
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 逐元素乘法(对应位相乘)
elem_wise = A * B
# 真正的线性代数矩阵点乘(使用 @ 运算符)
matmul = A @ B
print("逐元素相乘结果:\n", elem_wise)
print("矩阵乘法 (@) 结果:\n", matmul)
[[ 5 12]
[21 32]]
矩阵乘法 (@) 结果:
[[19 22]
[43 50]]
七、NumPy 矩阵创建方法快速选型指南
面对多样化的构造函数,读者可参考下表及决策流程图,根据原始数据的来源与计算目的进行快速匹配选择:
| 需求场景 | 推荐函数 | 关键参数 / 调用形态 | 典型返回类型 |
|---|---|---|---|
| 已有嵌套列表/序列转换 | np.array() |
np.array([[...]], dtype=...) |
根据输入推断或指定 dtype |
| 预先分配内存缓冲 / 全零重置 | np.zeros() |
(rows, cols), dtype=float |
默认 float64 |
| 掩码掩盖 / 基础全置为1 | np.ones() |
(rows, cols), dtype=float |
默认 float64 |
| 初始化为特定常数值 | np.full() |
(rows, cols), fill_value |
与 fill_value 类型匹配 |
| 单位矩阵生成 | np.eye() |
N, M=None, k=0 |
默认 float64 |
| 对角矩阵构建 / 对角提取 | np.diag() |
v, k=0 |
输入1D则出2D,输入2D则出1D |
| 固定步长规律序列矩阵 | arange + reshape |
np.arange(N).reshape(r, c) |
int32 / int64 |
| 连续闭区间等间距数值网格 | linspace + reshape |
np.linspace(s, e, N).reshape(r, c) |
float64 |
| 随机权重 / 统计模拟样本 | rng.random / integers |
rng.random(size=(r, c)) |
浮点或整型 |
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









