NumPy ValueError:具有多个元素的数组的真值是不明确的.使用a.any()或a.all()

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]) )
Run Code Online (Sandbox Code Playgroud)

DSM*_*DSM 19

错误消息很好地解释了它:

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

应该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
Run Code Online (Sandbox Code Playgroud)

您可能想要考虑np.allclose是否要比较浮点数组:

>>> np.allclose(np.array([1,2,3+1e-8]), np.array([1,2,3]))
True
Run Code Online (Sandbox Code Playgroud)


Mar*_*tin 11

正如它所说,它是模棱两可的.您的数组比较返回一个布尔数组.方法any()和all()减少数组上的值(logical_or或logical_and).而且,您可能不想检查是否相等.你应该用以下方法替换你的病情

np.allclose(A.dot(eig_vec[:,col]), eig_val[col] * eig_vec[:,col])
Run Code Online (Sandbox Code Playgroud)