5

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 ?

1

4 Answers 4

14

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
Sign up to request clarification or add additional context in comments.

Comments

3

Effectively you have a matrix delta_new which is being compared to another matrix epsilon**2 * delta_0 which produces multiple truth values.

With multiple truth values, there is not definitive yes or no.

So that condition can use .all (and for each element) or .any (or for each element) to resolve this multiplicity.

Comments

1

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.

I suspect that you want some scalar property on the matrices, such as determinant.

1 Comment

Ahh .. that makes sense. I am a freaking idiot !! Thanks :)
0

this also occurs for sparse matrices e.g.: `scipy.sparse.csr.csr_matrix

workaround is to add todense()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.