Подтвердить что ты не робот

Numpy.unique с сохраненным порядком

['b','b','b','a','a','c','c']

numpy.unique дает

['a','b','c']

Как мне сохранить первоначальный заказ

['b','a','c']

Отличные ответы. Бонусный вопрос. Почему ни один из этих методов не работает с этим набором данных? http://www.uploadmb.com/dw.php?id=1364341573 Здесь вопрос о тупой сортировке странного поведения

4b9b3361

Ответ 1

unique() медленно, O (Nlog (N)), но вы можете сделать это с помощью следующего кода:

import numpy as np
a = np.array(['b','a','b','b','d','a','a','c','c'])
_, idx = np.unique(a, return_index=True)
print(a[np.sort(idx)])

выход:

['b' 'a' 'd' 'c']

Pandas.unique() намного быстрее для большого массива O (N):

import pandas as pd

a = np.random.randint(0, 1000, 10000)
%timeit np.unique(a)
%timeit pd.unique(a)

1000 loops, best of 3: 644 us per loop
10000 loops, best of 3: 144 us per loop

Ответ 2

Используйте return_index функциональность np.unique. Это возвращает индексы, в которых элементы сначала попадали на вход. Тогда argsort те индексы.

>>> u, ind = np.unique(['b','b','b','a','a','c','c'], return_index=True)
>>> u[np.argsort(ind)]
array(['b', 'a', 'c'], 
      dtype='|S1')

Ответ 3

a = ['b','b','b','a','a','c','c']
[a[i] for i in sorted(np.unique(a, return_index=True)[1])]

Ответ 4

Если вы пытаетесь удалить дублирование уже отсортированного итерации, вы можете использовать функцию itertools.groupby:

>>> from itertools import groupby
>>> a = ['b','b','b','a','a','c','c']
>>> [x[0] for x in groupby(a)]
['b', 'a', 'c']

Это больше похоже на unix 'uniq', потому что он предполагает, что список уже отсортирован. Когда вы попробуете его в несортированном списке, вы получите что-то вроде этого:

>>> b = ['b','b','b','a','a','c','c','a','a']
>>> [x[0] for x in groupby(b)]
['b', 'a', 'c', 'a']

Ответ 5

Если вы хотите удалить повторяющиеся записи, например, инструмент Unix uniq, это решение:

def uniq(seq):
  """
  Like Unix tool uniq. Removes repeated entries.
  :param seq: numpy.array
  :return: seq
  """
  diffs = np.ones_like(seq)
  diffs[1:] = seq[1:] - seq[:-1]
  idx = diffs.nonzero()
  return seq[idx]

Ответ 6

Используйте OrderedDict (быстрее, чем понимание списка)

from collections import OrderedDict  
a = ['b','a','b','a','a','c','c']
list(OrderedDict.fromkeys(a))