[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