Skip to content
Advertisement

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

I am working on an Image Convolution code using 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

I get the below error:

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

on line while i < imax and delta_new > epsilon**2 * delta_0:

Could anyone please tell me what am I doing wrong ?

Advertisement

Answer

It looks like delta_new and delta_0 are Numpy arrays, and Numpy doesn’t know how to compare them.

As an example, imagine if you took two random Numpy arrays and tried to compare them:

>>> 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()

You have to basically “pick” how to collapse the comparisons of all of the values across all of your arrays down to a single bool.

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

>>> (a<b).all()
False
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement