Pregunta de numarray

Francesc Alted falted en openlc.org
Lun Nov 3 19:44:11 CET 2003


A Diumenge 02 Novembre 2003 11:00, David Picó va escriure:
> ¡Hola!
>
> Estoy trabajando con numarray y mi programa me está dando un warning que
> no entiendo. ¿Alquien me puede tirar una mano? Tengo una matriz de
> enteros m y quiero saber si un número determinado n aparece en algún
> lugar de la columna i. La instrucción que uso es:
>
>     if n in take(m, [i], axis=1): ...
>
> Pues bien, esto me da el warning
>
>     DeprecationWarning: Using a NumArray as a truth value is deprecated

Normalmente aparece este warning cuando usas objetos numarray en contextos
booleanos (sobretodo dentro de if's). Como la respuesta a preguntas
booleanas sobre arrays es un array de booleanos, siempre se prefiere que la
consulta se haga explícita. Imagina, por ejemplo lo siguiente:

>>> array([1,2,3]) == array([1,2,4])
array([1, 1, 0], type=Bool)

por tanto, una cosa como:

>>> if array([1,2,3]) == array([1,2,4]): print "true"
...
true

en cierta manera es verdad, pero no completamente (uno de los valores es
0!). En tu caso, la expresion:

>>> 2 in take(a, [1], axis=1)
True

es equivalente a decir que en el array booleano resultante de:

>>> take(a, [1], axis=1) == 2
array([[1],
       [0]], type=Bool)

existe algun valor diferente de 0, lo cual es claramente inequívoco en este
caso, pero no en general. De ahí que se recomiende siempre no poner
expresiones boolenanas numarray como valores verdad.

Una alternativa a tu problema es numarray.where i hacer uso de los slices.
Aquí tienes un ejemplo de uso (el uso explícito de where() se ha omitido en
este caso, ya que no hace falta ponerlo cuando trabajas con arrays
booleanos):

>>> a=array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> a[:,1]
array([2, 5])
>>> sometrue(a[:,1] == 2)
1
>>> sometrue(a[:,1] == 5)
1
>>> sometrue(a[:,1] == 4)
0

que, en mi opinión, queda mucho más claro que el uso de take().

-- 
Francesc Alted




Más información sobre la lista de distribución Python-es