Доступ к большому массиву numpy с сохранением его порядка

Я хотел бы получить доступ к массиву numpy data через индекс idx, но при этом сохранить порядок в data. Ниже приведен пример доступа к массиву в порядке, отличном от порядка исходного массива.

In [125]: data = np.array([2, 2.2, 2.5])

In [126]: idx=np.array([1,0])

In [127]: data[idx]
Out[127]: array([2.2, 2. ])

Вместо этого я надеюсь получить [2,2.2]. Есть ли высокоэффективный способ сделать это? В моей задаче у меня есть данные с более чем миллионом чисел с плавающей запятой и idx с 0,1 миллиона целых чисел.

Важная информация. При необходимости массив data можно предварительно обработать. Данные поступают из работы по обработке изображений. Например, если нам нужно заранее отсортировать data, время, затраченное на сортировку, не будет учитываться при измерении производительности. С другой стороны, idx - это то, что я бы не стал слишком много обрабатывать во время выполнения, поскольку время, потраченное на это, должно быть подсчитано. Например. сортировка idx с помощью алгоритма O(n log n) может быть слишком дорогой.


person zell    schedule 26.09.2020    source источник


Ответы (2)


Создайте логическую «маску»

 mask = np.zeros(data.shape, bool)
 mask[idx] = True
 res = data[mask]
person hpaulj    schedule 26.09.2020

Что-то вроде этого? Или я не понял сути?

data=np.array([2,2.2,2.5])
idx=np.array([1,0])
data[np.sort(idx)]
person domiziano    schedule 26.09.2020
comment
Где вывод последней команды: ››› array([2. , 2.2]) - person domiziano; 26.09.2020
comment
Спасибо, но сортировка idx с помощью алгоритма O(n log n) может быть слишком дорогой. С другой стороны, можно сортировать данные, если это необходимо. Итак, мои комментарии выше. - person zell; 26.09.2020