J'essaie de mettre tous les éléments de rbs dans un nouveau tableau si les éléments de var (un autre tableau numpy) sont> = 0 et <=. 1. Cependant, lorsque j'essaie le code suivant, j'obtiens cette erreur:
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()`
rbs = [ish[4] for ish in realbooks]
for book in realbooks:
var -= float(str(book[0]).replace(":", ""))
bidsred = rbs[(var <= .1) and (var >=0)]
des idées sur ce que je fais mal?
Comme je vous l'ai dit dans un commentaire sur une réponse précédente, vous devez utiliser soit:
c[a & b]
ou
c[np.logical_and(a, b)]
La raison en est que le mot clé and
est utilisé par Python pour tester entre deux booléens. Comment un tableau peut-il être un booléen? Si 75% de ses éléments sont True
, est-ce True
ou False
? Par conséquent, numpy refuse de comparer les deux.
Vous devez donc utiliser la fonction logique pour comparer deux tableaux booléens élément par élément (np.logical_and
) ou l'opérateur binaire &
.
De plus, pour l'indexation, vous avez vraiment besoin d'un tableau booléen de la même taille que le tableau que vous indexez. Et il doit s'agir d'un tableau , vous ne pouvez pas utiliser une liste de True/False
à la place: La raison en est que l'utilisation d'un tableau booléen indique à NumPy quel élément retourner. Si vous utilisez une liste de True/False
, NumPy l'interprétera comme une liste de 1/0
sous forme d'entiers, c'est-à-dire d'indices, ce qui signifie que vous obtenez le deuxième ou le premier élément de votre tableau. Pas ce que tu veux.
Maintenant, comme vous pouvez le deviner, si vous souhaitez utiliser deux tableaux booléens a
ou b
pour l'indexation, choisissez les éléments pour lesquels a
ou b
est True, vous utiliserez
c[np.logical_or(a,b)]
ou
c[a | b]
Vous obtenez généralement ce message d'erreur lorsque vous essayez d'utiliser des opérateurs booléens Python (not
, and
, or
) sur des expressions de comparaison impliquant des tableaux Numpy, par exemple.
>>> x = np.arange(-5, 5)
>>> (x > -2) and (x < 2)
Traceback (most recent call last):
File "<ipython-input-6-475a0a26e11c>", line 1, in <module>
(x > -2) and (x < 2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
C'est parce que de telles comparaisons, contrairement à d'autres comparaisons en Python, créent des tableaux de booléens plutôt que des booléens simples (mais vous le saviez peut-être déjà):
>>> x > -2
array([False, False, False, False, True, True, True, True, True, True], dtype=bool)
>>> x < 2
array([ True, True, True, True, True, True, True, False, False, False], dtype=bool)
Une partie de la solution à votre problème consiste probablement à remplacer and
par np.logical_and
, qui diffuse l’opération AND sur deux tableaux de np.bool
.
>>> np.logical_and(x > -2, x < 2)
array([False, False, False, False, True, True, True, False, False, False], dtype=bool)
>>> x[np.logical_and(x > -2, x < 2)]
array([-1, 0, 1])
Cependant, de tels tableaux de booléens ne peuvent pas être utilisés pour indexer dans des listes Python ordinaires, vous devez donc convertir cela en un tableau:
rbs = np.array([ish[4] for ish in realbooks])
# draw the previous original bounding boxes
if rectsPersist != None:
for (x, y, w, h) in rectsPersist:
cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)
# draw the previous final bounding boxes
if pickPersist != None:
for (xA, yA, xB, yB) in pickPersist:
cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)
if not count % 1:
count = 0
image = imutils.resize(image, width=min(700, image.shape[1]))
if rectsPersist! = Aucun: Utilisez a.any () ou a.all ()