4
votes

Erreur NumPy: la valeur de vérité d'un tableau avec plus d'un élément est ambiguë. Utilisez a.any () ou a.all ()

Je travaille sur un code de convolution d'image en utilisant numpy:

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

J'obtiens l'erreur ci-dessous:

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

sur la ligne while i epsilon ** 2 * delta_0:

Quelqu'un pourrait-il me dire ce que je fais mal?


1 commentaires

Bienvenue dans Stackoverflow! Pour tirer le meilleur parti du site, il est important de poser de bonnes questions , ce qui inclut la création d'un Minimal, Complet et Vérifiable .


3 Réponses :


1
votes

delta_new est une matrice. Les opérations de comparaison arithmétique linéaire ne sont pas définies pour les matrices. Vous avez essayé de comparer une matrice de valeurs à une autre matrice de valeurs avec une simple comparaison scalaire. Python ne sait pas comment vous donner un seul résultat T / F à partir de cela.

Je soupçonne que vous voulez une propriété scalaire sur les matrices, comme un déterminant.


1 commentaires

Ahh ... ça a du sens. Je suis un idiot flippant !! Merci :)



1
votes

En fait, vous avez une matrice delta_new qui est comparée à une autre matrice epsilon ** 2 * delta_0 qui produit plusieurs valeurs de vérité.

Avec plusieurs valeurs de vérité, il n'y a ni oui ni non définitif.

Pour que cette condition puisse utiliser .all (et pour chaque élément) ou .any (ou pour chaque élément) pour résoudre cette multiplicité.


0 commentaires

9
votes

Il semble que delta_new et delta_0 soient des tableaux Numpy, et Numpy ne sait pas comment les comparer.

À titre d'exemple, imaginez si vous en avez pris deux tableaux Numpy aléatoires et essayé de les comparer:

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

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

Vous devez essentiellement "choisir" comment réduire les comparaisons de toutes les valeurs de tous vos tableaux à un seul booléen.

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


0 commentaires