如何生成指定密度的0-1随机矩阵

如何生成指定密度的0-1随机矩阵

Python

本文介绍一种高效、可复用的方法,通过python函数创建n行m列的二值矩阵,精确控制1的个数(或密度),避免重复赋值和概率偏差问题。

本文介绍一种高效、可复用的方法,通过python函数创建n行m列的二值矩阵,精确控制1的个数(或密度),避免重复赋值和概率偏差问题。

在科学计算、模拟实验或机器学习数据生成中,常需构造具有精确稀疏度(即指定数量或比例的1)的0-1矩阵。与简单使用random.random() < d进行概率采样不同,本方案确保严格满足目标密度d——即矩阵中恰好包含d个1(而非期望值为d),从而消除随机波动带来的不确定性。

以下是推荐实现:

import random

def create_matrix(n, m, d):
    """
    创建 n 行 m 列的 0-1 矩阵,其中恰好包含 d 个 1。

    参数:
        n (int): 行数
        m (int): 列数
        d (int): 1 的总个数(必须满足 0 <= d <= n*m)

    返回:
        list[list[int]]: 二维列表形式的二值矩阵
    """
    total_cells = n * m
    if not isinstance(d, int) or d  total_cells:
        raise ValueError(f"d must be an integer between 0 and {total_cells}, inclusive")

    # 初始化全零矩阵
    matrix = [[0] * m for _ in range(n)]

    # 随机选择 d 个不重复的位置置为 1
    positions = random.sample(range(total_cells), d)
    for idx in positions:
        row = idx // m
        col = idx % m
        matrix[row][col] = 1

    return matrix

# 示例:生成 4×5 矩阵,含恰好 10 个 1(密度为 10/20 = 0.5)
result = create_matrix(4, 5, 10)
for row in result:
    print(row)

优势说明

  • 使用 random.sample() 直接无放回地抽取 d 个唯一索引,避免循环重试,时间复杂度稳定为 O(d),远优于原答案中可能陷入长等待的 while 循环;
  • 支持边界校验(如 d 超出合法范围时抛出清晰异常),提升鲁棒性;
  • 若需按密度比例(如 d=0.3 表示 30% 的 1),可扩展为:
    if isinstance(d, float) and 0.0 <= d <= 1.0:
        d = int(round(d * n * m))

⚠️ 注意事项

  • 原提问代码存在逻辑错误:内层循环重复生成 m 个长度为 m 的行,导致结果为 n × m × m 维嵌套结构;
  • 概率填充法(如 random.random() < density)虽简洁,但无法保证精确计数,仅适用于对密度容忍一定方差的场景;
  • 对超大规模矩阵(如百万级元素),建议改用 NumPy 实现以获得更好性能与内存效率。

该函数简洁、可靠、可扩展,是构建可控稀疏结构的理想基础工具。

本文地址:https://www.sztg.com.cn/article/672116.html

如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!

猜您喜欢