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

时间:2014-03-04 15:02:29

标签: 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]) )

3 个答案:

答案 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(您的变量),然后跟命令进行比较,无论您希望执行什么操作。