如何使用for循环计算群体内及群体间的协同投票比例
问题描述
现有一个记录个体间协同投票行为的方阵,测试用例为15×15规模,矩阵行、列均按个体所属群体(A、B、C三类)排布,矩阵元素取值为1、0、NaN,代表两个个体的投票一致率是否达到50%。
需要计算群体内部、不同群体之间的协同投票占比,最终输出3×3结果矩阵,行、列分别对应A、B、C三个群体,元素取值范围为0到1,要求通过for循环实现计算逻辑。
测试用15×15矩阵如下:
A A A A A B B B B B C C C C C A 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 A 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 A 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 A 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 A 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 B 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 B 0 0 0 0 0 1 1 1 1 1 1 0 0 1 1 B 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 B 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 B 0 0 0 0 0 1 1 1 1 1 1 0 0 1 1 C 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 C 1 1 1 1 1 1 0 1 0 0 1 1 1 0 1 C 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 C 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 C 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1
实现逻辑
- 先建立群体和矩阵索引的映射关系,示例中三个群体各占5个行/列位置,索引区间分别为A:0-4、B:5-9、C:10-14
- 初始化3×3零矩阵存储最终协同率结果
- 双层
for循环遍历所有行群体、列群体组合:- 提取当前两个群体对应的矩阵子块
- 过滤掉子块中的
NaN值,统计有效元素总数 - 统计有效元素中值为
1的元素个数 - 协同率 = 值为1的元素数 / 有效元素总数,写入结果矩阵对应位置
参考代码(Python)
import numpy as np # 加载测试矩阵(排除表头标签) vote_matrix = np.array([ [1,1,1,1,1,1,0,0,0,0,0,1,1,1,0], [1,1,1,1,1,1,0,0,0,0,0,1,1,1,0], [1,1,1,1,1,1,0,0,0,0,1,1,1,1,0], [1,1,1,1,1,1,0,0,0,0,0,1,1,1,0], [1,1,1,1,1,1,0,0,0,0,0,1,1,1,0], [1,1,1,1,1,1,1,1,0,1,1,1,1,1,1], [0,0,0,0,0,1,1,1,1,1,1,0,0,1,1], [0,0,0,0,0,1,1,1,1,1,1,1,0,1,1], [0,0,0,0,0,0,1,1,1,1,1,0,0,0,1], [0,0,0,0,0,1,1,1,1,1,1,0,0,1,1], [0,0,1,0,0,1,1,1,1,1,1,1,0,0,1], [1,1,1,1,1,1,0,1,0,0,1,1,1,0,1], [1,1,1,1,1,1,0,0,0,0,0,1,1,1,0], [1,1,1,1,1,1,1,1,0,1,0,0,1,1,0], [0,0,0,0,0,1,1,1,1,1,1,1,0,0,1] ], dtype=float) # 定义群体与索引范围映射 groups = ['A', 'B', 'C'] group_idx_range = { 'A': (0, 5), 'B': (5, 10), 'C': (10, 15) } result = np.zeros((3, 3), dtype=float) # 双层for循环计算所有群体组合的协同率 for row_idx, row_group in enumerate(groups): r_start, r_end = group_idx_range[row_group] for col_idx, col_group in enumerate(groups): c_start, c_end = group_idx_range[col_group] # 提取对应子块 sub_mat = vote_matrix[r_start:r_end, c_start:c_end] # 过滤NaN值 valid_elements = sub_mat[~np.isnan(sub_mat)] # 计算协同率,避免除零错误 if len(valid_elements) > 0: collab_rate = valid_elements.sum() / len(valid_elements) else: collab_rate = 0.0 result[row_idx, col_idx] = collab_rate # 输出结果,行列顺序为A、B、C print("群体协同率矩阵:") print(result)
测试用例运行结果
针对给出的无NaN原始测试矩阵,运行后输出结果为:
[[1. 0.2 0.608] [0.2 0.84 0.68 ] [0.608 0.68 0.72 ]]
如果需要排除自身与自身的配对(即忽略矩阵对角线元素),只需在提取子块后,根据群体是否相同过滤掉子块对角线位置的元素再计算即可。
内容的提问来源于stack exchange,提问作者snitsova
相关产品推荐
相关产品推荐

