寻找重排后Numpy数组元素的原始索引
高效实现Numpy数组元素的原始索引追踪
给定两个形状相同的Numpy数组,需要追踪第一个数组的元素在第二个数组中的位置变化——具体来说,要为第二个数组中的每个元素找到它在第一个数组中的原始索引,数组本身是未排序的。
示例1:元素全部存在
a1 = np.array([1, 2, 3, 4]) # 原始数组 a2 = np.array([2, 1, 3, 4]) # 新数组 # 预期结果: [1, 0, 2, 3] # 解释: # - 2 原本在索引1的位置 # - 1 原本在索引0的位置 # - 3 原本在索引2的位置 # - 4 原本在索引3的位置
示例2:包含新增元素
a1 = np.array([1, 2, 3, 4]) a2 = np.array([2, 1, 33, 4]) # 预期结果: [1, 0, -1, 3] # 说明:值33不在原始数组中,对应索引设为-1
我目前用的两种方案:
- 列表推导式方案:
[a1.tolist().index(v) if v in a1 else -1 for v in a2]
- Numpy广播匹配方案:
np.where(a2[:, None] == a1)[1]
但第二种方法在示例2的场景下无法正常工作,因为当a2中存在a1没有的元素时,返回的索引长度会和a2的长度不一致,无法得到正确结果。
实际场景中我的数组是百万级行数,列数较少(少于10列),想知道有没有更高效的实现方式?
内容的提问来源于stack exchange,提问作者Aenaon
相关产品推荐
相关产品推荐

