복붙노트

[PYTHON] 정렬없이 numpy 고유 [중복]

PYTHON

정렬없이 numpy 고유 [중복]

결과를 정렬하지 않고 numpy 고유를 어떻게 사용할 수 있습니까? 순서대로 나타납니다. 이 같은?

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

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

오히려

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

순진한 솔루션을 사용하여 간단한 기능을 작성하는 것이 좋습니다. 하지만이 작업을 여러 번 수행해야하므로이 작업을 수행하는 빠르고 깔끔한 방법이 있습니까?

해결법

  1. ==============================

    1.return_index 매개 변수를 사용하여이 작업을 수행 할 수 있습니다.

    return_index 매개 변수를 사용하여이 작업을 수행 할 수 있습니다.

    >>> import numpy as np
    >>> a = [4,2,1,3,1,2,3,4]
    >>> np.unique(a)
    array([1, 2, 3, 4])
    >>> indexes = np.unique(a, return_index=True)[1]
    >>> [a[index] for index in sorted(indexes)]
    [4, 2, 1, 3]
    
  2. ==============================

    2.이와 같이 numpy를 사용하면 이렇게 할 수 있습니다. mergsort가 안정적이므로 각 값의 첫 번째 또는 마지막 항목을 선택할 수 있습니다.

    이와 같이 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는 내부적으로 불안정한 정렬을 사용하므로 특정 인덱스, 즉 처음 또는 마지막을 보장 할 수는 없습니다.

    주문한 dict도 작동한다고 생각합니다.

    def unique(array):
        uniq = OrderedDict()
        for i in array:
             uniq[i] = 1
        return uniq.keys()
    
  3. from https://stackoverflow.com/questions/12926898/numpy-unique-without-sort by cc-by-sa and MIT license