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
Quelqu'un pourrait-il me dire ce que je fais mal?
3 Réponses :
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.
Ahh ... ça a du sens. Je suis un idiot flippant !! Merci :)
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é.
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()
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 .