Есть ли способ сообщить Numpy, что столбец сортируется при выполнении среза? Предположительно, тогда он мог бы нарезаться быстрее?

#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:] срез был бы быстрее (a view ), но получение результата n из теста равенства (или вместо него) не является тривиальным.

2. Если вы писали свой собственный код в c (или, может numba быть), вы можете мыслить последовательно / итеративно, находя первое истинное условие в массиве. Но с помощью скомпилированных numpy методов нам обычно приходится мыслить в параллельных / векторизованных терминах — действиях, которые применяются ко всему массиву без контроля порядка. numpy методы выполняют итерацию в скомпилированном коде, но лишь немногие, если таковые вообще имеются, имеют об этом представление first find then break . Обычно они работают со всем массивом.

3. Аааа, хорошо, я понимаю. Итак, сначала сортировка не выигрывает, потому что сначала она выравнивается и в любом случае теряет сортировку?