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

如何通过三元组索引填充12×12的Numpy数组?

三元组转12×12矩阵填充解决方案

问题说明

需将三元组列表comm_link_lst转换为12×12的Numpy矩阵:矩阵(i,j)位置对应三元组前两元素为(i,j)的第三个值,无匹配项的位置填充0。当前嵌套循环+列表推导会生成空列表,破坏索引结构,需修复或优化实现方式。


最优实现:直接遍历三元组填充矩阵

这种方法仅需遍历一次三元组列表,无需嵌套遍历所有i,j,效率最高且代码简洁:

import numpy as np

# 示例三元组列表(补全结构)
comm_link_lst = [(0, 1, 2), (0, 0, 28), (0, 9, 3), (0, 8, 3), (0, 5, 5), 
                 (0, 3, 4), (0, 4, 8), (0, 2, 1), (0, 6, 1), (0, 7, 4), 
                 (0, 11, 1), (1, 1, 36), (1, 8, 5), (1, 11, 2), (1, 9, 7), 
                 (1, 2, 2), (1, 5, 1), (1, 7, 2), (1, 10, 2), (1, 6, 1), 
                 (1, 3, 1), (2, 3, 5), (2, 2, 44), (2, 6, 10), (2, 4, 5), 
                 (2, 9, 3), (2, 10, 3), (2, 7, 4), (2, 11, 2), (2, 8, 1)]

# 初始化全0矩阵
num = np.zeros((12, 12))

# 遍历三元组直接赋值
for i, j, val in comm_link_lst:
    num[i][j] = val

print(num)

未被赋值的位置默认保持0,完全符合预期输出。


方案2:先构建索引字典再填充

适合需要复用索引映射的场景,通过字典快速查询(i,j)对应的数值:

import numpy as np

comm_link_lst = [(0, 1, 2), (0, 0, 28), (0, 9, 3), (0, 8, 3), (0, 5, 5), 
                 (0, 3, 4), (0, 4, 8), (0, 2, 1), (0, 6, 1), (0, 7, 4), 
                 (0, 11, 1), (1, 1, 36), (1, 8, 5), (1, 11, 2), (1, 9, 7), 
                 (1, 2, 2), (1, 5, 1), (1, 7, 2), (1, 10, 2), (1, 6, 1), 
                 (1, 3, 1), (2, 3, 5), (2, 2, 44), (2, 6, 10), (2, 4, 5), 
                 (2, 9, 3), (2, 10, 3), (2, 7, 4), (2, 11, 2), (2, 8, 1)]

# 转换为{(i,j): value}的字典
link_map = {(x[0], x[1]): x[2] for x in comm_link_lst}

num = np.zeros((12, 12))
for i in range(12):
    for j in range(12):
        # 存在索引则取对应值,否则用0
        num[i][j] = link_map.get((i, j), 0)

print(num)

方案3:修正lst2生成逻辑(保留扁平化列表需求)

如果需要先得到扁平化的lst2(144个元素,空位置为0),用next()函数处理空匹配的情况:

import numpy as np

comm_link_lst = [(0, 1, 2), (0, 0, 28), (0, 9, 3), (0, 8, 3), (0, 5, 5), 
                 (0, 3, 4), (0, 4, 8), (0, 2, 1), (0, 6, 1), (0, 7, 4), 
                 (0, 11, 1), (1, 1, 36), (1, 8, 5), (1, 11, 2), (1, 9, 7), 
                 (1, 2, 2), (1, 5, 1), (1, 7, 2), (1, 10, 2), (1, 6, 1), 
                 (1, 3, 1), (2, 3, 5), (2, 2, 44), (2, 6, 10), (2, 4, 5), 
                 (2, 9, 3), (2, 10, 3), (2, 7, 4), (2, 11, 2), (2, 8, 1)]

lst2 = []
for i in range(12):
    for j in range(12):
        # 取第一个匹配值,无匹配则返回0
        val = next((x[2] for x in comm_link_lst if x[0]==i and x[1]==j), 0)
        lst2.append(val)

# 转换为12×12矩阵
num = np.array(lst2).reshape(12, 12)
print(num)

这里next()会从生成器中获取第一个匹配结果,生成器为空时返回默认值0,彻底解决空列表问题。


内容的提问来源于stack exchange,提问作者StackSpin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:40:07