#numpy #sorting #slice
#numpy #сортировка #срез
Вопрос:
Например:
arr = np.array([[0,1],[0,2],[0,3],[1,4],[1,5],[2,6],[3,7]])
arr2 = arr[arr[:,0]==1]
В этом примере он очень быстрый, но если я пытаюсь нарезать что-то похожее, но со 100 миллионами строк, поможет ли это, если я отсортирую его по первому столбцу и каким-то образом сообщу Numpy, что он отсортирован? Т.Е. Как только вы найдете первое истинное значение, другие истинные значения будут смежными?
Комментарии:
1. Имейте в виду, что ваше выражение состоит из нескольких этапов.
arr[:,0]==1
создание 1d логического массива. затемarr[mask]
индексация.arr[n:]
срез был бы быстрее (aview
), но получение результатаn
из теста равенства (или вместо него) не является тривиальным.2. Если вы писали свой собственный код в
c
(или, можетnumba
быть), вы можете мыслить последовательно / итеративно, находя первое истинное условие в массиве. Но с помощью скомпилированныхnumpy
методов нам обычно приходится мыслить в параллельных / векторизованных терминах — действиях, которые применяются ко всему массиву без контроля порядка.numpy
методы выполняют итерацию в скомпилированном коде, но лишь немногие, если таковые вообще имеются, имеют об этом представлениеfirst find then break
. Обычно они работают со всем массивом.3. Аааа, хорошо, я понимаю. Итак, сначала сортировка не выигрывает, потому что сначала она выравнивается и в любом случае теряет сортировку?