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

Posted on

### Question :

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 ?

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
``````

Effectively you have a matrix `delta_new` which is being compared to another matrix `epsilon**2 * delta_0` which produces multiple truth values.
So that condition can use `.all` (and for each element) or `.any` (or for each element) to resolve this multiplicity.
`delta_new` is a matrix. Linear arithmetic comparison operations are not defined for matrices. You tried to compare a matrix of values to another matrix of values with a simple scalar comparison. Python doesn’t know how to give you a single T/F result from this.