Я пытаюсь извлечь из массива все значения в определенном фрагменте (что-то вроде диапазона, но с необязательным началом, остановкой и шагом< /код>). И при этом я хочу извлечь выгоду из тяжелой оптимизации, которую объекты range используют для range.__contains__(), что означает, что им никогда не нужно создавать экземпляр всего диапазона значений (сравните Почему «1000000000000000 в диапазоне(1000000000000001)» так быстро в Python 3?).
Следующий код работает, но он ужасно неэффективен, потому что i преобразуется в полноценный массив , увеличивая использование памяти и время выполнения.
Код: Выделить всё
import numpy as np
arr = np.array([0, 20, 29999999, 10, 30, 40, 50])
M = np.max(arr)
# slice based on values
s = slice(20, None)
i = range(*s.indices(M + 1))
print(arr[np.isin(arr, i)]) # works, but inefficient!
Выход:
Есть ли функция numpy, позволяющая улучшить это напрямую? Должен ли я использовать np.vectorize/
вместо этого с обратным вызовом с использованием среза (кажется, что возврат от C++ к Python для каждого отдельного элемента тоже может быть медленным [или это не будет делать?])? Должен ли я вычесть start из своих значений, разделить на шаг, а затем посмотреть, равны ли значения >= 0 && < (stop - start)/step? Или я упускаю гораздо лучший способ?
Подробнее здесь:
https://stackoverflow.com/questions/786 ... dices-in-a