如何将矩阵转换为3D矩阵以支持list[i][j][k]索引访问?
解决方案
首先,你的原始矩阵外层多了一层不必要的列表包裹,且每个单元格是单个数值类型(无法通过[0]索引)。要实现list[i][j][k]的访问形式,需要两步转换:
- 移除外层多余的列表,得到二维矩阵
- 将每个单元格的数值转换为包含两个元素的列表(对应k=0和k=1的行/列索引)
具体代码实现
根据你对k的定义(k=0为指向的行索引,k=1为指向的列索引),分两种常见场景处理:
场景1:原单元格数值就是指向的行/列索引
如果原矩阵中每个单元格的数值直接代表指向的行索引,且列索引与行索引相同:
a = [[[0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6], [2, 3, 2, 3, 4,5], [3, 2, 3, 4, 3, 4], [4, 3, 4, 5, 4, 3], [5, 4, 5, 6, 5, 4]]] # 第一步:移除外层多余列表,得到二维矩阵 a_2d = a[0] # 第二步:将每个元素转为包含两个元素的列表 a_3d = [[[val, val] for val in row] for row in a_2d] # 现在可以按目标形式访问 print(a_3d[5][5][0]) # 输出4 print(a_3d[5][5][1]) # 输出4
场景2:单元格指向的行/列索引是其自身的位置(i,j)
如果希望list[i][j][0]返回当前单元格的行号i,list[i][j][1]返回列号j:
a = [[[0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6], [2, 3, 2, 3, 4,5], [3, 2, 3, 4, 3, 4], [4, 3, 4, 5, 4, 3], [5, 4, 5, 6, 5, 4]]] a_2d = a[0] a_3d = [[[i, j] for j, _ in enumerate(row)] for i, row in enumerate(a_2d)] print(a_3d[5][5][0]) # 输出5 print(a_3d[5][5][1]) # 输出5
为什么之前的尝试失败?
- 直接用括号包裹列表:只是增加了嵌套层级,没有把单个数值转为可索引的列表
b = [[i] for i in a]:仅在外层列表基础上再嵌套一层,没有处理内层的单个数值元素
内容的提问来源于stack exchange,提问作者TheRi
相关产品推荐
相关产品推荐

