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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:24:31