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]
>>> [sorted(indexes) のインデックスの a[index]]
[4、2、1、3]
于 2012-10-17T04:11:20.400 に答える
6

numpy を使用して次のようなことを行うことでこれを行うことができます。マージソートは安定しているため、各値の最初または最後の出現を選択できます。

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 に答える