我在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]) )
答案 0 :(得分:16)
错误消息很好地解释了它:
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
答案 1 :(得分:10)
正如它所说,这是模棱两可的。您的数组比较返回一个布尔数组。方法any()和all()减少数组上的值(logical_or或logical_and)。而且,您可能不想检查是否相等。您应该用以下内容替换您的条件:
np.allclose(A.dot(eig_vec[:,col]), eig_val[col] * eig_vec[:,col])
答案 2 :(得分:0)
尝试此=> numpy.array(您的变量),然后跟命令进行比较,无论您希望执行什么操作。