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

19 投票
3 回答
181945 浏览
提问于 2025-04-17 20:47

我在用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 个回答

-4

试试这个:用 numpy.array(yourvariable) 来把你的变量转换成数组,然后再用你想要的命令来进行比较。

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

而且这还没有考虑到多维数组的复杂性。

所以,由于“一个包含多个元素的数组的真值是模糊的”,你应该使用 .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
12

正如所说的,这里有点模糊。你的数组比较会返回一个布尔数组,也就是一系列的真或假。方法 any() 和 all() 会对这个数组里的值进行处理(要么是逻辑“或”,要么是逻辑“与”)。而且,你可能并不想检查是否相等。你应该把你的条件换成:

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

撰写回答