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])
3 个回答
-4
试试这个:用 numpy.array(yourvariable) 来把你的变量转换成数组,然后再用你想要的命令来进行比较。
29
这个错误信息解释得很清楚:
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
;
而且这还没有考虑到多维数组的复杂性。
所以,由于“一个包含多个元素的数组的真值是模糊的”,你应该使用 .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
12
正如所说的,这里有点模糊。你的数组比较会返回一个布尔数组,也就是一系列的真或假。方法 any() 和 all() 会对这个数组里的值进行处理(要么是逻辑“或”,要么是逻辑“与”)。而且,你可能并不想检查是否相等。你应该把你的条件换成:
np.allclose(A.dot(eig_vec[:,col]), eig_val[col] * eig_vec[:,col])