У меня есть большой numpy
матрицы M
. Некоторые из строк матрицы имеют все свои элементы как ноль, и мне нужно получить индексы этих строк. Наивный подход, который я рассматриваю, - это цикл каждой строки в матрице, а затем проверка каждого элемента. Однако я думаю, что для этого можно использовать более быстрый и быстрый подход, используя numpy
. Я надеюсь, что вы можете помочь!
Поиск в строках всех элементов как нулей в матрице с 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])