如何将一维索引映射数组应用于二维索引数组的元素转换?
Numpy索引数组的映射转换实现
问题说明
给定二维Numpy数组arr,其中元素为索引值(-1表示无对应索引),以及二维映射数组trans,trans的第n个元素对应arr中值为n的元素的转换目标值。需要将arr中的元素按trans规则转换,得到目标输出。
输入数据
import numpy as np # 待转换的二维索引数组 arr = np.array([ [ 1, 2, -1, -1], [ 0, 1, -1, -1], [ 3, 5, -1, -1], [ 7, 8, -1, -1], [ 6, 7, -1, -1], [ 9, 11, -1, -1]]) # 映射数组,trans[n][0]对应arr中值为n的转换目标 trans = np.array([[ 0], [-1], [ 1], [-1], [ 2], [-1], [ 3], [-1], [ 4], [-1], [ 5], [-1]])
解决方案
方法一:掩码筛选+索引映射
# 将二维映射数组转为一维,方便直接索引 trans_flat = trans.flatten() # 初始化结果数组,保留原arr的结构 result = arr.copy() # 筛选出arr中需要转换的元素位置(排除-1) mask = arr != -1 # 对目标位置执行映射转换 result[mask] = trans_flat[arr[mask]] print(result)
方法二:np.where简洁写法
trans_flat = trans.flatten() result = np.where(arr == -1, -1, trans_flat[arr]) print(result)
输出结果
array([[-1, 1, -1, -1], [ 0, -1, -1, -1], [-1, -1, -1, -1], [-1, 4, -1, -1], [ 3, -1, -1, -1], [-1, -1, -1, -1]])
代码解释
- 扁平化映射数组:
trans.flatten()将二维列向量转为一维数组,使得trans_flat[n]可以直接获取arr中值为n的目标转换值。 - 掩码筛选:通过
arr != -1定位需要转换的元素,避免对-1执行索引操作(会触发数组越界错误)。 - 映射赋值:利用Numpy的向量化索引特性,一次性完成所有目标元素的转换,效率远高于循环遍历。
内容的提问来源于stack exchange,提问作者KDecker
相关产品推荐
相关产品推荐

