如何通过三元组索引填充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
相关产品推荐
相关产品推荐

