web-dev-qa-db-fra.com

La valeur de vérité d'un tableau comportant plusieurs éléments est ambiguë lors de la tentative d'indexation

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?

14
Rtrader

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]
29
Pierre GM

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])
8
Fred Foo
# 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 ()

0
Neelu