You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:05:32