[pyar] Multiples condiciones con numpy

Ariel Hernán Curiale curiale en gmail.com
Lun Mayo 8 20:58:05 ART 2017


Hola Carlos,

Veamos la primer línea que tira error y las demás son de alguna forma similar:


> np.where((savi < 0.1),0.00002)

si miras la documentación de where, por ejemplo desde ipython poniendo np.where? vas a ver:

Docstring:
where(condition, [x, y])

Return elements, either from `x` or `y`, depending on `condition`.

If only `condition` is given, return ``condition.nonzero()``.


donde esta esta nota:

Notes
-----
If `x` and `y` are given and input arrays are 1-D, `where` is
equivalent to::

    [xv if c else yv for (c,xv,yv) in zip(condition,x,y)]


básicamente lo que dice es que si lo usas np.where(condicion, [x, y]) tenes que pasar lo que da cuando se cumple la condición y lo que da cuando no se cumple. Entonces para que funcione esa línea, asumiendo que lo que querés es tener un array de valores con los originales cuando su valor es < a 0.1 y 0.00002 cuando son mayores o igual a 0.1, deberías pasar: 
np.where(savi < 0.1,  0.00002, savi). 

En este caso se utiliza  broadcasting para pasar de el valor  0.00002 a un array de 0.00002, es equivalente a: np.where(savi < 0.1, 0.00002*np.ones_like(savi), savi)


Igual fijate que con numpy podes  hacer cosas del estilo:

idx = savi < 0.1
savi[idx] = 0.00002  —> pero claro acá estas modificando el array original.


También podes hacer:

idx = savi < 0.1
nuevo_array = idx.astype(float) * 0.00002
nuevo_array[~idx] = savi[~idx] —> si la matriz savi es muy grande deberías negar una sola vez idx


Por ultimo podrías hacer lo mismo con el np.where de esta forma (sin pasar [x, y]):

nuevo_array = savi.copy()
nuevo_array[np.where( savi > 0.00002 )] = 0.00002



Saludos
 ___________________________
| Ariel Hernán Curiale, Ph.D
| Research assistant at CONICET 
| FCEN, Univ. Nacional de Cuyo 
| Padre Jorge Contreras 1300
| 5500 Mendoza, Argentina
| Phone: +54 261 423 6003
| Web: www.curiale.com.ar
|___________________________

> On May 8, 2017, at 19:54, carlos hernandez <carlitoshernandez20 en gmail.com> wrote:
> 
> Hola gente, escribo por el siguiente motivo: estoy trabajando con imagenes satelitales a la cuales convierto en arrays para poder realizar algunas operaciones posteriormente. Resulta que debo de pasar un numpy.array por un if, para´lo  cual busqué y encontré que numpy tiene reservada la función numpy.where para hacer este tipo de operaciones, pero al llamar la función me devuelve el siguiente error:
> 
> ValueError: either both or neither of x and y should be given
> 
> el codigo para probar que utilice es el siguiente:
> 
> def iaf(savi):
> 	iaf = np.where((savi < 0.1),0.00002)
> 	iaf = np.where(((0.1 < savi) & (savi < 0.687)),(-np.log((0.69-savi)/0.59)/0.91))
> 	iaf = np.where(savi > 0.687,6)
> 	return iaf
> 
> savi = np.array([0.01,0.5,0.7,0.001,0.00006])
> print iaf(savi)
> 
> 
> Muchas Gracias
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
> 
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
> 
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170508/0ca770e5/attachment.html>


Más información sobre la lista de distribución pyar