如何将两元素列表转换为NumPy二维数组的元素索引而非行索引
核心原理说明
numpy的多维索引规则里:
- 方括号内传入
list类型的[i,j]时,会被识别为沿第一维度的高级索引,返回第i、j两行 - 方括号内传入
tuple类型的(i,j),或是逗号分隔的两个独立参数i,j时,会被识别为多维度索引,返回i行j列的单个元素
你提到的*是Python的序列解包运算符,作用是把可迭代对象的元素按位置拆分为独立参数:arr[*[i,j]]等价于arr[i,j],本质就是把列表的两个元素拆开作为索引的两个独立参数,自然就能取到单个元素。
方案1:单索引解包写法
首先你原代码的循环逻辑有误:for i in path()时,i本身就是[i_n,j_n]格式的索引对,不需要再通过path()[i]取值。
修改后的循环写法如下:
import numpy as np grid = np.full((3,3), 1) def path(): # 示例返回值 return [[0,1], [2,2], [1,0]] # 写法1:用*解包 for idx in path(): grid[*idx] = 0 # 写法2:转tuple,兼容性更好(适配旧版本Python) for idx in path(): grid[tuple(idx)] = 0
方案2:高性能向量化写法(高频执行首选)
循环操作在索引量较大时性能很低,直接用numpy向量化操作可以避免Python层循环,性能提升10~100倍不等,完全适配高频执行场景:
indices = np.array(path()) # 直接批量对所有索引位置赋值 grid[indices[:, 0], indices[:, 1]] = 0
内容的提问来源于stack exchange,提问作者Tobias Holm
相关产品推荐
相关产品推荐

