Проблема заключается в том, что между двумя массивами является сравнение по элементам - вы возвращаете массив значений типа boolean. Массив логических значений не является булевым значением, поэтому вы не можете использовать его в if
. Это то, что ошибка пытается вам рассказать.
может решить это с помощью метода all
, чтобы проверить, являются ли все элементы в булевом массиве истинными. Но вы делаете это более сложным, чем вам нужно. Ненулевые значения truthy, нулевые значения falsey, так что вы можете просто использовать any
без сравнения:
if not np.dot(M, v).any():
Если вы хотите, чтобы сделать сравнение нуля явно, просто сравните скаляр, не строит ноль вектор; он будет транслироваться одинаково. И, если вы когда-либо do хотите построить нулевой вектор, просто используйте функцию zeros
; не стройте list
нулей сложным способом и передайте его asarray
.
Вы также можете использовать функцию count_nonzero
здесь в качестве другой альтернативы. Если он возвращает что-либо правдоподобное (то есть любое ненулевое число), массив имел по крайней мере один ненулевой.
В общем, вы делаете почти все, что необходимо, и, используя краткое руководство по NumPy, а затем сканирование основных страниц документов для полезных функций действительно поможет вам.
Кроме того, если значения не являются целыми числами, вы, вероятно, на самом деле не хотят, чтобы сравнить == 0
в первую очередь. Числа с плавающей запятой накапливают ошибки округления. Для этого воспользуйтесь функцией allclose
.
Ваш внутренний цикл всегда будет «ломаться», поскольку вы включаете нулевой вектор в тестовые векторы, который, безусловно, будет в ядре 'M'. Чего вы пытаетесь достичь? –
@SvenMarnach Код еще не закончен, но спасибо, что вы правы. – marshall