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

19

我正在使用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])

这个回答解决了你的问题吗?[ValueError:具有多个元素的数组的真值是模糊的。使用a.any()或a.all()](https://dev59.com/Gmkw5IYBdhLWcg3wMHyn) - Mateen Ulhaq
3个回答

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

考虑到N维情况的复杂性,"具有多个元素的数组的真值是不确定的",因此应该使用例如.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

and you might want to consider np.allclose if you're comparing arrays of floats:

>>> np.allclose(np.array([1,2,3+1e-8]), np.array([1,2,3]))
True

你已经使用 .any().all() 处理了情况(2)和(3),但是否仍有一种简单的方法来获取numpy数组的真值(非空列表)? - Robin De Schepper
1
@RobinDeSchepper - 可能是 bool(the_array.size) - wwii

12

正如它所说,这是模棱两可的。你的数组比较会返回一个布尔数组。方法 any() 和 all() 将值规约到数组上(逻辑或或逻辑与)。此外,你可能不想检查相等性。你应该用以下条件替换你的条件:

np.allclose(A.dot(eig_vec[:,col]), eig_val[col] * eig_vec[:,col])

-4
尝试这个 => numpy.array(你的变量) 然后跟随你想要比较的命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接