Python用NumPy创建矩阵的几种常用方法

Mia
Mia
发布时间:2026-11-08 | 5人浏览过
原创

详细讲解在Python中使用NumPy创建二维矩阵的五种常用方法,涵盖从列表转换、固定值占位、单位与对角矩阵、序列重塑到随机矩阵生成,并深入解析ndarray选型要点与dtype机制。

在Python科学计算与数据分析中,NumPy是处理二维矩阵结构的核心工具。创建矩阵最常用的五类路径分别是:从已有列表直接转换、使用全0/全1等固定值占位初始化、构建单位矩阵与对角矩阵、通过等差数列重塑形状,以及使用随机数生成器。本文将逐一讲解这些方法的调用语法、执行机制与适用场景,并剖析二维数组与旧式矩阵对象的选型区别。
Python用NumPy创建矩阵的几种常用方法
图 1:NumPy 构建二维矩阵的五类核心实现方案

一、基于已有数据结构创建矩阵: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,禁止构建不规则的不齐整数组。

Python用NumPy创建矩阵的几种常用方法
图 2:np.array() 将动态列表转换为连续内存块与二维元数据的推导过程

二、使用固定值与占位函数创建矩阵

在很多数值算法中,我们需要在开始迭代前提前分配好矩阵的内存空间,或者填充特定的初始常数。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]]
Python用NumPy创建矩阵的几种常用方法
图 3:全零矩阵、单位矩阵与对角矩阵在内存中的二维分布特征

三、构建单位矩阵与对角矩阵: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)
代码运行输出示例
3x4 递增矩阵:
 [[ 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。

两者的关键差异集中在算符重载和切片维度保持上:

Python用NumPy创建矩阵的几种常用方法
图 4:二维 ndarray 与传统 np.matrix 在运算符行为与切片维度的对比
# 二维 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)) 浮点或整型
Python用NumPy创建矩阵的几种常用方法
图 5:NumPy 矩阵创建函数的场景决策流程图
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表