如何将numpy数组处理结果out1恢复为原行顺序得到out2?
问题描述
给定一个每行包含0-9唯一值的NumPy数组p,每行元素会形成5对配对,满足p[k] = p[p[k]](k∈0-9)。以行[6, 5, 3, 2, 9, 1, 0, 8, 7, 4]为例,配对为(6,0)、(5,1)、(3,2)、(9,4)、(8,7)。
通过以下代码分离出配对的首尾元素并生成out1:
import numpy as np p = np.array([6, 5, 3, 2, 9, 1, 0, 8, 7, 4]) p1 = np.where(p[p] < p) # 配对中第一个元素的索引 p2 = (p[p1]) # 配对中第二个元素的索引 qi = np.hstack((p1, p2.reshape(1,5))) qv = p[qi] # 输出: # qi = [0, 1, 2, 4, 7, 6, 5, 3, 9, 8] # 配对首元素索引,后跟配对尾元素索引 # qv = [6, 5, 3, 9, 8, 0, 1, 2, 4, 7] # 对应的值
将qv与数组c = [1, 1, 1, 1, 1, -1, -1, -1, -1, -1]相乘得到:
out1 = [6, 5, 3, 9, 8, 0, -1, -2, -4, -7]
需要将out1恢复为原数组p的行元素顺序,得到目标数组:
out2 = [6, 5, 3, -2, 9, -1, 0, 8, -7, -4]
请问如何实现?
解决方案
核心思路是利用qi数组记录的索引映射关系,将out1的元素按原数组的索引位置重新排列。具体代码实现如下:
import numpy as np # 原数据 p = np.array([6, 5, 3, 2, 9, 1, 0, 8, 7, 4]) c = np.array([1, 1, 1, 1, 1, -1, -1, -1, -1, -1]) # 保留原逻辑生成qi、qv和out1 p1 = np.where(p[p] < p) p2 = p[p1] qi = np.hstack((p1, p2.reshape(1, 5))).flatten() # 转为一维数组确保索引操作正常 qv = p[qi] out1 = qv * c # 关键步骤:按qi的索引映射填充空数组,恢复原顺序 out2 = np.empty_like(out1) out2[qi] = out1 print(out2) # 输出:[ 6 5 3 -2 9 -1 0 8 -7 -4]
逻辑说明
qi数组存储了out1中每个元素对应的原数组索引位置,比如out1[0]对应原数组索引0,out1[5]对应原数组索引6。- 创建与
out1同形状的空数组out2,通过out2[qi] = out1的索引赋值操作,直接将out1的元素按原数组的顺序填充到位。
内容的提问来源于stack exchange,提问作者user109387
相关产品推荐
相关产品推荐

