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), а затем команду для сравнения, что вы хотите.