【问题标题】:NumPy ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()NumPy ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
【发布时间】:2014-04-06 04:43:22
【问题描述】:

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

【问题讨论】:

    标签: numpy


    【解决方案1】:

    try this=> numpy.array(yourvariable) 后跟要比较的命令,随心所欲。

    【讨论】:

      【解决方案2】:

      正如它所说,它是模棱两可的。您的数组比较返回一个布尔数组。方法 any() 和 all() 减少数组上的值(logical_or 或logical_and)。此外,您可能不想检查是否相等。您应该将您的条件替换为:

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

      【讨论】:

        【解决方案3】:

        错误信息解释得很好:

        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))一样,非空列表是truelike;

        (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
        

        【讨论】:

        • 您已经用.any().all() 覆盖了案例(2)和(3),但是还有一种简单的方法可以获取 numpy 的真实(非空列表)值数组?
        • @RobinDeSchepper - 可能是bool(the_array.size)
        猜你喜欢
        • 2020-05-12
        • 2016-01-26
        • 2019-07-30
        • 2020-01-28
        相关资源
        最近更新 更多