[pyar] Multiples condiciones con numpy

carlos hernandez carlitoshernandez20 en gmail.com
Lun Mayo 8 21:01:08 ART 2017


Hola, gracias por tomarte el tiempo de responder, justo estaba probando y
logre llegar a lo que quería...

me quedo así la función...

def iaf(savi):

iaf = np.where((0.1 < savi) & (savi < 0.687),
((-1*(np.log((0.69-savi)/0.59)))/0.91) ,
np.where((savi < 0.1), 0.00002,
np.where((savi > 0.687), 6, 6)))
return iaf

Muchas gracias y disculpen la molestia

El 8 de mayo de 2017, 20:58, Ariel Hernán Curiale <curiale en gmail.com>
escribió:

> 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
>
>
>
> _______________________________________________
> 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/a304b221/attachment-0001.html>


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