You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中按行列约束优化0-1矩阵:为全零行加非冲突1

实现步骤

可以通过以下步骤完成需求:

  1. 识别全零行:找出矩阵中所有元素均为0的行。
  2. 确定可添加1的列:筛选出原始矩阵中无任何1的列(即该列所有行的元素总和为0)。
  3. 为每个全零行随机添加1:对每个全零行,随机选择2或3个上述允许的列,将对应位置设为1。

代码实现

import numpy as np

# 原始矩阵
uvv = np.array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]])

# 1. 获取所有全零行的索引
zero_rows = np.where(np.all(uvv == 0, axis=1))[0]

# 2. 获取所有允许添加1的列(原始矩阵中该列无1)
allowed_cols = np.where(uvv.sum(axis=0) == 0)[0]

# 3. 为每个全零行随机添加2或3个1
for row_idx in zero_rows:
    # 随机选择要添加的1的数量(2或3)
    num_ones = np.random.choice([2, 3])
    # 随机选择不重复的允许列
    selected_cols = np.random.choice(allowed_cols, size=num_ones, replace=False)
    # 设置对应位置为1
    uvv[row_idx, selected_cols] = 1

# 输出结果
print(uvv)

代码说明

  • 识别全零行:np.all(uvv == 0, axis=1) 返回布尔数组标记每行是否全为0,再用np.where提取这些行的索引。
  • 确定允许列:uvv.sum(axis=0) 计算每列的元素总和,总和为0的列即为无1的列,用np.where提取其索引。
  • 随机添加1:对每个全零行,先随机选择2或3个1的数量,再从允许列中随机挑选对应数量的不重复列,最后将这些位置设为1。

若需保留原始矩阵,可先复制一份(如tem = uvv.copy())再执行修改操作。

内容的提问来源于stack exchange,提问作者Maluma Corazón

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:51