NumPy错误:包含多个元素的数组的真值不明确。使用a.any()或a.all()

时间:2019-01-15 01:49:05

标签: python python-3.x numpy

我正在使用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 < imax and delta_new > epsilon**2 * delta_0:

有人可以告诉我我做错了什么吗?

3 个答案:

答案 0 :(得分:1)

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

我怀疑您希望矩阵具有标量属性,例如行列式。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

看起来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