Python元组索引行列结构列表触发TypeError报错问题咨询
问题说明
BS为列表类型,需求是构造带有行列结构的BS列表,用于定义其他位置信息,运行代码时触发如下报错:
TypeError: list indices must be integers or slices, not tuples
核心疑问:是否需要将BS的数据类型调整为Cell Array、tuple或其他类型才能实现需求?
相关实现代码片段:
BS = [] BS.append([]) value = max(ravel(BSpar)) [r, c]= find(BSpar == value, nargout=2) for j in range(K): block = BS[r,c][i * Ksize:(i - 1) * Ksize, j * Ksize:(j + 1) * Ksize] Bblock[i].append(block)
报错原因
这个报错和数据类型选择、语法适配直接相关:
- Python原生列表不支持元组格式的多维索引,你写的
BS[r,c]本质是把元组(r,c)作为索引值传入,而Python列表仅支持整数、切片作为合法索引,这和Matlab中直接用(行号,列号)索引矩阵、元胞数组的语法规则完全不同。 - 你当前初始化的
BS仅追加了一层空列表,本质是一维结构,本身也不具备二维行列存储能力,就算修正索引写法也无法定位到对应行列的元素。
修复方案
不需要强行适配Matlab的Cell Array概念,根据实际存储需求二选一即可:
- 如果
BS存储的是同类型数值类多维数据,直接用NumPy数组替代原生列表是最优选择。NumPy原生支持[r,c]形式的多维索引,也支持多维切片操作,和你当前写的索引逻辑完全适配,只需要提前把BS初始化为对应行列尺寸的NumPy数组就行。 - 如果
BS需要存储不同类型、不同尺寸的元素(对应Matlab里Cell Array的使用场景),就用多层嵌套列表实现,索引时必须分层书写:BS[r][c],不能把行列坐标放在同一对方括号里。注意要提前把嵌套列表的行列结构初始化完整,不要只追加一层空列表就开始索引取值。
额外提示:你代码里的行切片i * Ksize:(i - 1) * Ksize存在逻辑问题,正整数i的情况下起始索引大于结束索引,切片结果会是空值,大概率是笔误,应为(i - 1) * Ksize : i * Ksize。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

