Быстрое удаление дубликатов в numpy и python

Есть ли какой-нибудь быстрый способ получить уникальные элементы в numpy? У меня есть код, похожий на этот (последняя строка)

tab = numpy.arange(100000000)

indices1 = numpy.random.permutation(10000)
indices2 = indices1.copy()
indices3 = indices1.copy()
indices4 = indices1.copy()

result = numpy.unique(numpy.array([tab[indices1], tab[indices2], tab[indices3], tab[indices4]]))

Это просто пример, а в моей ситуации indices1, indices2,...,indices4 содержат разный набор индексов и имеют разный размер. Последняя строка выполняется много раз, и я заметил, что она является узким местом в моем коде ({numpy.core.multiarray.arange}, чтобы быть более точным). Кроме того, упорядочивание не важно, а элементы в массиве индексов имеют тип int32. Я думал использовать hashtable со значением элемента в качестве ключа и попробовал:

seq = itertools.chain(tab[indices1].flatten(), tab[indices2].flatten(), tab[indices3].flatten(), tab[indices4].flatten())
myset = {}
map(myset.__setitem__, seq, [])
result = numpy.array(myset.keys())

но получилось еще хуже.

Есть ли способ ускорить это? Я предполагаю, что снижение производительности происходит из-за "причудливой индексации", которая копирует массив, но мне нужен результирующий элемент только для чтения (я ничего не изменяю).

6
задан Eric O Lebigot 23 December 2011 в 21:23
поделиться