12 numpy
我在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]) )
DSM*_*DSM 19
错误消息很好地解释了它:
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;
而这甚至没有考虑到Nd案件的复杂性.
因此,由于"具有多个元素的数组的真值是不明确的",您应该使用.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
Mar*_*tin 11
正如它所说,它是模棱两可的.您的数组比较返回一个布尔数组.方法any()和all()减少数组上的值(logical_or或logical_and).而且,您可能不想检查是否相等.你应该用以下方法替换你的病情
np.allclose(A.dot(eig_vec[:,col]), eig_val[col] * eig_vec[:,col])