Примените np.where к фильтрации квадратных скобок для фильтрации пустышек - PullRequest
0 голосов
/ 22 января 2019

Я мог бы выполнить фильтрацию пустых массивов через

a[np.where(a[:,0]==some_expression)]

или

a[a[:,0]==some_expression]

Каковы (не) преимущества каждой из этих версий - особенно в отношении производительности?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Логическое индексирование преобразуется во внутреннее целочисленное индексирование. Это указано в документах :

Как правило, если индекс включает в себя логический массив, результат будет идентично вставке obj.nonzero() в ту же позицию и используя механизм индексации целочисленных массивов, описанный выше.

Таким образом, сложность двух подходов одинакова. Но np.where более эффективен для больших массивов:

np.random.seed(0)
a = np.random.randint(0, 10, (10**7, 1))
%timeit a[np.where(a[:, 0] == 5)]  # 50.1 ms per loop
%timeit a[a[:, 0] == 5]            # 62.6 ms per loop

Теперь np.where имеет и другие преимущества: расширенная целочисленная индексация хорошо работает в нескольких измерениях. Для примера, где логическое индексирование не является интуитивно понятным в этом аспекте, см. Индексирование NumPy: широковещание с логическими массивами . Поскольку np.where более эффективен, чем логическое индексирование, это просто дополнительная причина, по которой его следует использовать.

0 голосов
/ 22 января 2019

К моему удивлению, первый, кажется, работает немного лучше:

a = np.random.random_integers(100, size=(1000,1))

import timeit

repeat = 3
numbers = 1000

def time(statement, _setup=None):
  print(min(
    timeit.Timer(statement, setup=_setup or setup).repeat(repeat, numbers)))

setup = """from __main__ import np, a"""

time('a[np.where(a[:,0]==99)]')
time('a[(a[:,0]==99)]')

отпечатков (например):

0.017856399000000023
0.019185326999999974

Увеличение размера массива приводит к еще большему различию чисел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...