如何生成每行和为1、每列和≥1的m*n 0-1矩阵?
解决0-1矩阵列和≥1的问题
要生成每行和为1、每列和≥1的m×n(注:原代码中n是行数,p是列数,下文统一用行数n、列数p表述)0-1矩阵,核心是先保证每列至少被选中一次,再处理剩余行。原代码的问题在于随机选列时可能漏掉某些列,以下是修改方案:
必要前提
行数n必须≥列数p,否则每行仅1个1,总共有n个1,列数超过行数时必然有列和为0,数学上无法满足要求。
修改后的代码
import numpy as np import random # 定义行数和列数,根据实际需求修改 n = 5 # 行数 p = 3 # 列数 # 合法性检查:行数不能小于列数 if n < p: raise ValueError("行数必须大于等于列数,否则无法保证每列和≥1") # 初始化n行p列的全0矩阵 pt = np.zeros((n, p), dtype=int) # 第一步:给每列分配至少一个1 # 从n行中挑选p个不同的行,每个列对应一个唯一的行位置设为1 unique_rows = random.sample(range(n), p) for col_idx in range(p): pt[unique_rows[col_idx], col_idx] = 1 # 第二步:处理剩余的行,每行随机选一个列设为1 remaining_rows = [row for row in range(n) if row not in unique_rows] for row_idx in remaining_rows: random_col = random.randint(0, p-1) pt[row_idx, random_col] = 1 # 验证结果(可选) column_sums = pt.sum(axis=0) print("每列元素和:", column_sums) print("生成的矩阵:") print(pt)
代码说明
- 合法性检查:先判断行数是否足够,避免无效操作。
- 保底分配:通过
random.sample选p个不重复的行,给每个列都分配至少一个1,从根源上避免列和为0。 - 剩余行处理:剩下的行随机选列填充1,此时所有列已经有至少一个1,后续随机选择不会破坏条件。
内容的提问来源于stack exchange,提问作者user21559
相关产品推荐
相关产品推荐

