NumPy ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте команды a.any() или a.all()

Я вычислял собственные векторы и собственные значения матрицы в NumPy и просто хотел проверить результаты через assert(). Это вызовет значение ValueError, которое я не совсем понимаю, поскольку печать этих сравнений работает очень хорошо. Любые подсказки, как я мог бы заставить этот assert() работать?

import numpy as np
A = np.array([[3,5,0], [5,7,12], [0,12,5]])
eig_val, eig_vec = np.linalg.eig(A)
print('eigenvalue:', eig_val)
print('eigenvector:', eig_vec)

for col in range(A.shape[0]):
    assert( (A.dot(eig_vec[:,col])) == (eig_val[col] * eig_vec[:,col]) )

Ответ 1

Как говорится, это неоднозначно. Сравнение массива возвращает логический массив. Методы any() и all() уменьшают значения по массиву (либо логические, либо логические_и). Более того, вы, вероятно, не хотите проверять равенство. Вы должны заменить свое условие:

np.allclose(A.dot(eig_vec[:,col]), eig_val[col] * eig_vec[:,col])

Ответ 2

Сообщение об ошибке объясняет это довольно хорошо:

ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all()

Что должно вернуть bool(np.array([False, False, True]))? Вы можете сделать несколько правдоподобных аргументов:

(1) True, потому что bool(np.array(x)) должен возвращать то же самое, что и bool(list(x)), а непустые списки верны;

(2) True, потому что хотя бы один элемент True;

(3) False, потому что не все элементы True;

и что даже не учитывая сложность случая N-d.

Итак, поскольку "значение истинности массива с более чем одним элементом неоднозначно", вы должны использовать .any() или .all(), например:

>>> v = np.array([1,2,3]) == np.array([1,2,4])
>>> v
array([ True,  True, False], dtype=bool)
>>> v.any()
True
>>> v.all()
False

и вы можете рассмотреть np.allclose, если вы сравниваете массивы поплавков:

>>> np.allclose(np.array([1,2,3+1e-8]), np.array([1,2,3]))
True

Ответ 3

попробуйте это => numpy.array(yourvariable), а затем команду для сравнения, что вы хотите.