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

我正在使用 numpy 处理图像卷积代码:

def CG(A, b, x, imax=10, epsilon = 0.01):
    steps=np.asarray(x)
    i = 0
    r = b - A * x
    d = r.copy()
    delta_new = r.T * r
    delta_0 = delta_new
    while i < imax and delta_new > epsilon**2 * delta_0:
        q = A * d
        alpha = float(delta_new / (d.T * q))
        x = x + alpha * d
        if i%50 == 0:
            r = b - A * x
        else:
            r = r - alpha * q
        delta_old = delta_new
        delta_new = r.T * r
        beta = float(delta_new / delta_old)
        d = r + beta * d
        i = i + 1
        steps = np.append(steps, np.asarray(x), axis=1)
    return steps

我收到以下错误:

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

在线while i &lt; imax and delta_new &gt; epsilon**2 * delta_0:

谁能告诉我我做错了什么?

【问题讨论】:

标签: python python-3.x numpy


【解决方案1】:

delta_new 是一个矩阵。没有为矩阵定义线性算术比较操作。您尝试通过简单的标量比较将一个值矩阵与另一个值矩阵进行比较。 Python 不知道如何给你一个单一的 T/F 结果。

我怀疑您需要矩阵上的一些标量属性,例如行列式。

【讨论】:

  • 啊……说得通。我是个彻头彻尾的白痴!!谢谢:)
【解决方案2】:

实际上,您有一个矩阵 delta_new 与另一个矩阵 epsilon**2 * delta_0 进行比较,后者产生多个真值。

对于多个真值,没有确定的是或否。

因此该条件可以使用.all(并针对每个元素)或.any(或针对每个元素)来解决这种多重性。

【讨论】:

    【解决方案3】:

    看起来delta_newdelta_0 是 Numpy 数组,而 Numpy 不知道如何比较它们。

    举个例子,想象一下如果你拿了两个随机的 Numpy 数组并试图比较它们:

    >>> a = np.array([1, 3, 5])
    >>> b = np.array([5, 3, 1])
    >>> print(a<b)
    array([True, False, False])
    >>> bool(a<b)
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    

    您必须基本上“选择”如何将所有数组中所有值的比较折叠为单个布尔值。

    >>> (a<b).any()
    True
    
    >>> (a<b).all()
    False
    

    【讨论】:

      【解决方案4】:

      稀疏矩阵也会出现这种情况,例如:`scipy.sparse.csr.csr_matrix

      解决方法是添加todense()

      【讨论】:

        猜你喜欢
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 2019-05-30
        • 2020-03-02
        • 1970-01-01
        • 2015-07-16
        相关资源
        最近更新 更多