【发布时间】:2018-03-28 02:08:54
【问题描述】:
我有两个包含相同值集的一维数组,但顺序不同。我想找到索引列表,它根据另一个数组重新排序一个数组。例如,我的 2 个数组是:
ref = numpy.array([5,3,1,2,3,4])
new = numpy.array([3,2,4,5,3,1])
我想要order 的列表new[order] == ref。
我目前的想法是:
def find(val):
return numpy.argmin(numpy.absolute(ref-val))
order = sorted(range(new.size), key=lambda x:find(new[x]))
但是,这仅适用于没有重复值的情况。在我的示例中,3 出现了两次,我得到了new[order] = [5 3 3 1 2 4]。第二个3 直接放在第一个之后,因为我的函数val() 不跟踪我当前正在寻找的3。
所以我可以添加一些东西来解决这个问题,但我觉得可能会有更好的解决方案。也许在某个库(NumPy 或 SciPy)中?
关于重复的编辑:这个linked solution 假定数组是有序的,或者对于“无序”解决方案,返回重复的索引。我需要每个索引在order 中只出现一次。然而,哪个先出现并不重要(根据提供的数据,这两者都不可能)。
我用sort_idx = A.argsort(); order = sort_idx[np.searchsorted(A,B,sorter = sort_idx)] 得到的是:[3, 0, 5, 1, 0, 2]。但我要找的是[3, 0, 5, 1, 4, 2]。
【问题讨论】:
-
如果元素重复,你得到哪个索引真的很重要吗?除了
a[ind]之外,您还想做什么来获得b? -
话虽如此,是的,有一种方法可以使用多个 argsort。等我到了真正的电脑上,我就写出来。
-
@Divakar。这不是同一个问题。它要求找到洗牌的索引,而不是子集。因此,使用 argsort 可以进行很好的优化,但不适用于其他问题。我希望你支持我重新开张的提议。
-
@MadPhysicist 不确定您指的是哪个子集。那里的 searchsorted 解决方案给出了索引,这是这个问题中预期的
order。您是否尝试过该解决方案? -
@Divakar 我试过了,我在
order中得到了一些多个索引(见编辑)。
标签: numpy