如何将Numpy索引转换为坐标?自定义数组类getitem实现需求
索引转坐标的实现方案
全坐标生成+筛选法
对于任意形状的数组,先生成所有元素的完整坐标矩阵,再根据传入的索引条件筛选目标坐标。以形状(2,2,2)为例:
- 生成全维度坐标:
import numpy as np shape = (2,2,2) # 生成各维度的索引网格,转换为(N, 维度数)的坐标数组 coords = np.stack(np.indices(shape), axis=-1).reshape(-1, len(shape)) # 输出:[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
- 按索引
...,1筛选:
这个索引等价于前两维取所有、第三维固定为1,直接对坐标数组的第三列做条件判断即可:
mask = coords[:, 2] == 1 selected_coords = coords[mask] # 输出:[[0,0,1],[0,1,1],[1,0,1],[1,1,1]]
通用索引适配方案
如果要支持所有Numpy风格索引(省略号、切片、整数索引、布尔索引等),可以通过占位数组反向推导坐标:
shape = (2,2,2) dummy = np.zeros(shape) # 用用户传入的索引提取子数组 sub_array = dummy[..., 1] # 获取子数组在原数组中的位置索引 indices = np.where(sub_array) # 组合为(N, 维度数)的坐标数组 selected_coords = np.stack(indices, axis=-1)
这种方法自动适配所有索引类型,无需手动解析省略号或切片逻辑。
适配块稀疏张量场景
在你的自定义张量类__getitem__方法中,可以按以下流程处理:
- 根据张量的形状初始化坐标生成逻辑
- 用上述方法将用户传入的索引转换为具体的块坐标
- 匹配坐标对应的对称关系,找到内存中存储的唯一块
- 应用酉变换、转置等操作生成目标块并返回
内容的提问来源于stack exchange,提问作者fishjojo
相关产品推荐
相关产品推荐

