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