31

如何使用 numpy unique 而不对结果进行排序,而只是按照它们在序列中出现的顺序?像这样的东西?

a = [4,2,1,3,1,2,3,4]

np.unique(a) = [4,2,1,3]

而不是

np.unique(a) = [1,2,3,4]

使用幼稚的解决方案应该可以编写一个简单的函数。但是由于我需要多次执行此操作,是否有任何快速简洁的方法来执行此操作?

4

2 回答 2

60

您可以使用以下return_index参数执行此操作:

>>> 将 numpy 导入为 np
>>> a = [4,2,1,3,1,2,3,4]
>>> np.unique(a)
数组([1, 2, 3, 4])
>>> 索引 = np.unique(a, return_index=True)[1]
>>> [a[index] for index in sorted(indexes)]
[4、2、1、3]
于 2012-10-17T04:11:20.400 回答
6

您可以通过执行以下操作使用 numpy 执行此操作,mergsort 是稳定的,因此它可以让您挑选出每个值的第一次或最后一次出现:

def unique(array, orderby='first'):
    array = np.asarray(array)
    order = array.argsort(kind='mergesort')
    array = array[order]
    diff = array[1:] != array[:-1]
    if orderby == 'first':
        diff = np.concatenate([[True], diff])
    elif orderby == 'last':
        diff = np.concatenate([diff, [True]])
    else:
        raise ValueError
    uniq = array[diff]
    index = order[diff]
    return uniq[index.argsort()]

这个答案非常类似于:

def unique(array):
    uniq, index = np.unique(array, return_index=True)
    return uniq[index.argsort()]

但是, numpy.unique 在内部使用不稳定的排序,因此不能保证您获得任何特定的索引,即第一个或最后一个。

我认为有序的字典也可能有效:

def unique(array):
    uniq = OrderedDict()
    for i in array:
         uniq[i] = 1
    return uniq.keys()
于 2012-10-17T04:13:44.763 回答