如何在Python中按行列约束优化0-1矩阵:为全零行加非冲突1
实现步骤
可以通过以下步骤完成需求:
- 识别全零行:找出矩阵中所有元素均为0的行。
- 确定可添加1的列:筛选出原始矩阵中无任何1的列(即该列所有行的元素总和为0)。
- 为每个全零行随机添加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
相关产品推荐
相关产品推荐

