Поиск в строках всех элементов как нулей в матрице с numpy

У меня есть большой numpy матрицы M. Некоторые из строк матрицы имеют все свои элементы как ноль, и мне нужно получить индексы этих строк. Наивный подход, который я рассматриваю, - это цикл каждой строки в матрице, а затем проверка каждого элемента. Однако я думаю, что для этого можно использовать более быстрый и быстрый подход, используя numpy. Я надеюсь, что вы можете помочь!

Ответ 1

Вот один из способов. Я предполагаю, что numpy был импортирован с использованием import numpy as np.

In [20]: a
Out[20]: 
array([[0, 1, 0],
       [1, 0, 1],
       [0, 0, 0],
       [1, 1, 0],
       [0, 0, 0]])

In [21]: np.where(~a.any(axis=1))[0]
Out[21]: array([2, 4])

Это небольшое изменение этого ответа: как проверить, что матрица содержит нулевой столбец?

Вот что происходит:

any метод возвращает True, если любое значение в массиве является "правдивым". Ненулевые числа считаются истинными, а 0 считается False. Используя аргумент axis=1, метод применяется к каждой строке. Для примера a имеем:

In [32]: a.any(axis=1)
Out[32]: array([ True,  True, False,  True, False], dtype=bool)

Поэтому каждое значение указывает, содержит ли соответствующая строка ненулевое значение. Оператор ~ является двоичным "не" или дополнением:

In [33]: ~a.any(axis=1)
Out[33]: array([False, False,  True, False,  True], dtype=bool)

(Альтернативным выражением, которое дает тот же результат, является (a == 0).all(axis=1).)

Чтобы получить индексы строк, мы используем функцию where. Он возвращает индексы, где его аргумент True:

In [34]: np.where(~a.any(axis=1))
Out[34]: (array([2, 4]),)

Обратите внимание, что в where возврата кортежа, содержащего один массив. where работает для n-мерных массивов, поэтому он всегда возвращает кортеж. Нам нужен единственный массив в этом кортеже.

In [35]: np.where(~a.any(axis=1))[0]
Out[35]: array([2, 4])