2012-09-28 3 views
11

Ich versuche alle Elemente von rbs in ein neues Array zu setzen, wenn die Elemente in var (ein anderes numpy Array)> = 0 und < = .1. Jedoch, wenn ich den folgenden Code versuchen, bekomme ich diesen Fehler:Der Wahrheitswert eines Arrays mit mehr als einem Element ist zweideutig, wenn versucht wird, ein Array zu indizieren.

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

irgendwelche Ideen, was ich falsch mache?

+0

Welche Zeile verursacht den Fehler? Formatieren Sie auch Ihren Code so, dass er tatsächlich ausgeführt wird. –

+0

Es würde helfen, wenn Sie den Wert von Var ausdrucken würden. Bei einer Schätzung ist das Problem in der Zeichenfolge/float/text ersetzte Variable, die Sie dekrementieren ... Wie sehen die ursprünglichen Daten aus, die diese Reihe von Operationen erfordern würde? – abought

Antwort

27

Wie ich Ihnen in einem Kommentar zu einem frühen erzählt Antwort, müssen Sie entweder:

c[a & b] 

oder

c[np.logical_and(a, b)] 

Der Grund ist, dass das Schlüsselwort and von Python zum Testen zwischen zwei booleschen Werten verwendet wird. Wie kann ein Array ein boolescher Wert sein? Wenn 75% der Artikel sind True ist es True oder False? Daher lehnt numpy den Vergleich der beiden ab.

So müssen Sie entweder die logische Funktion verwenden, um zwei boolesche Arrays auf Elementbasis (np.logical_and) oder den Binäroperator & zu vergleichen.

Darüber hinaus benötigen Sie für die Indizierung wirklich ein boolesches Array mit der gleichen Größe wie das Array, das Sie indexieren. Und es muss ein Array sein, können Sie nicht eine Liste von True/False stattdessen verwenden: Der Grund ist, dass die Verwendung eines booleschen Array NumPy welches Element zurückgibt. Wenn Sie eine Liste von True/False verwenden, wird NumPy dies als eine Liste von 1/0 als Ganzzahlen interpretieren, das heißt, Indizes, was bedeutet, dass Sie entweder das zweite oder erste Element Ihres Arrays erhalten. Nicht was du willst.

Nun, wie Sie sich vorstellen können, wenn Sie zwei Boolesche Arrays a oder b für die Indizierung verwenden möchten, die Elemente, für die Wahl entweder a oder b ist wahr, dann würden Sie

c[np.logical_or(a,b)] 

oder

verwenden
c[a | b] 
8

Sie in der Regel diese Fehlermeldung erhalten, wenn sie versuchen Python Booleschen Operatoren zu verwenden (not, and, or) auf Vergleichsausdrücke Numpy Arrays beteiligt, z.B.

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

Das ist, weil solche Vergleiche, wie in Python zu anderen Vergleiche im Gegensatz Arrays von booleans zu schaffen, anstatt einzelne booleans (aber vielleicht wussten Sie schon, dass):

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

Ein Teil der Lösung Ihrer Problem wahrscheinlich and von np.logical_and zu ersetzen, was sendet die UND-Verknüpfung über zwei Anordnungen von 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]) 

jedoch solche Anordnungen von booleans können nicht auf Index in gewöhnliche Python-Listen verwendet werden, so müssen Sie das auf ein Array konvertieren:

rbs = np.array([ish[4] for ish in realbooks]) 
Verwandte Themen