2012-09-28 8 views
11

Próbuję umieścić wszystkie elementy rbs w nowej tablicy, jeśli elementy w var (inna tablica numpy) jest> = 0 i < = .1. Jednak kiedy próbuję następujący kod otrzymuję ten błąd:Wartość true tablicy z więcej niż jednym elementem jest niejednoznaczna podczas próby indeksowania tablicy

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

jakieś pomysły na to, co robię źle?

+0

Która linia powoduje błąd? Proszę również sformatować swój kod, aby faktycznie działał. –

+0

Pomoże to wydrukować wartość var. Przypuszczam, że problem dotyczy zmiennej traconej/zmiennoprzecinkowej/tekstowej, którą zmniejszamy ... Jak wyglądają oryginalne dane wymagające serii operacji? – abought

Odpowiedz

27

Jak już mówiłem w komentarzu do poprzedniego odpowiedź, trzeba użyć albo:

c[a & b] 

lub

c[np.logical_and(a, b)] 

Powodem jest to, że słowo kluczowe and jest używane przez Pythona do testowania między dwoma bajtami. W jaki sposób tablica może być boolowska? Jeśli 75% jej pozycji to True, czy jest to True lub False? Dlatego numpy odmawia porównania tych dwóch.

Musisz więc użyć funkcji logicznej, aby porównać dwie tablice logiczne dla poszczególnych elementów (np.logical_and) lub operatora binarnego &.

Co więcej, do celów indeksowania naprawdę potrzebujesz tablicy boolowskiej o tym samym rozmiarze, co indeksowana tablica. I musi to być tablica, nie można użyć listy True/False zamiast: Powodem jest to, że użycie tablicy boolowskiej mówi NumPy, który element ma zwrócić. Jeśli użyjesz listy True/False, NumPy zinterpretuje to jako listę 1/0 jako liczb całkowitych, czyli indeksów, co oznacza, że ​​otrzymasz drugi lub pierwszy element swojej tablicy. Nie tego chcesz.

Teraz, jak można się domyślać, czy chcesz korzystać z dwóch logicznych tablice a lub b dla indeksowania, wybierając elementy, dla których albo a lub b to prawda, że ​​ty używać

c[np.logical_or(a,b)] 

lub

c[a | b] 
8

Zazwyczaj ten komunikat o błędzie podczas próby użycia Python operatorów logicznych (not, and, or) na wyrażeniach porównawczych obejmujących, na przykład tablice numpy

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

To dlatego takie porównania, w przeciwieństwie do innych porównań w Pythonie, tworzenia tablic logicznych zamiast pojedynczych wartości logicznych (ale może już wiedział, że):

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

częścią rozwiązania do swojej problem prawdopodobnie zastąpi and przez np.logical_and, który nadaje operację AND na dwóch tablicach 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]) 

Jednakże takie tablice wartości logicznych nie może być używany do indeksu w zwykłych listach Pythona, więc trzeba przekonwertować do tablicy:

rbs = np.array([ish[4] for ish in realbooks]) 
Powiązane problemy