2012-09-28 16 views
11

Estoy tratando de poner todos los elementos de rbs en una nueva matriz si los elementos en var (otra matriz numpy) son> = 0 y < = .1. Sin embargo cuando intento el siguiente código me sale este error:El valor de verdad de una matriz con más de un elemento es ambiguo cuando intento indexar una matriz

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

alguna idea de lo que estoy haciendo mal?

+0

¿Qué línea causa el error? Además, formatee su código para que realmente se ejecute. –

+0

Ayudaría si imprimiera el valor de var. En una suposición, el problema está en la variable de cadena/flotante/texto que está disminuyendo ... ¿Cómo se ven los datos originales que requerirían esa serie de operaciones? – abought

Respuesta

27

Como te dije en un comentario a un anterior respuesta, es necesario utilizar ya sea:

c[a & b] 

o

c[np.logical_and(a, b)] 

La razón es que Python usa la palabra clave and para probar entre dos booleanos. ¿Cómo puede una matriz ser un booleano? Si el 75% de sus artículos son True, ¿es True o False? Por lo tanto, numpy se niega a comparar los dos.

Por lo tanto, debe utilizar la función lógica para comparar dos matrices booleanas elemento por elemento (np.logical_and) o el operador binario &.

Además, para fines de indexación, realmente necesita una matriz booleana con el mismo tamaño que la matriz que está indexando. Y tiene que ser una matriz, no puede usar una lista de True/False en su lugar: La razón es que usar una matriz booleana le dice a NumPy qué elemento devolver. Si utiliza una lista de True/False, NumPy lo interpretará como una lista de 1/0 como enteros, es decir, índices, lo que significa que obtendrá el segundo o primer elemento de su matriz. No es lo que quieres

Ahora, como se puede adivinar, si desea utilizar dos matrices booleanas a o b para la indexación, la elección de los elementos para los que sea a o b es cierto, que tendría que utilizar

c[np.logical_or(a,b)] 

o

c[a | b] 
8

Por lo general, este mensaje de error al intentar utilizar los operadores booleanos (Python not, and, or) en expresiones de comparación que involucran matrices, por ejemplo 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() 

Eso es porque este tipo de comparaciones, a diferencia de otras comparaciones en Python, crean matrices de booleanos en lugar de booleanos simples (pero tal vez ya sabían que):

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

Parte de la solución a su problema probablemente para reemplazar and por np.logical_and, que transmite la operación Y en dos matrices 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]) 

Sin embargo, este tipo de matrices de booleanos no se pueden utilizar para indexar en las listas de Python ordinarios, por lo que necesita para convertir eso a una matriz:

rbs = np.array([ish[4] for ish in realbooks]) 
Cuestiones relacionadas