2010-12-09 11 views
8

Let decir que tenemos una matriz¿Cómo se puede operar cada elemento de una matriz numpy de acuerdo con su valor relativo?

a = np.array([10,30,50, 20, 10, 90, 0, 25]) 

El pseudo código para lo que quiero -

if a[x] > 80 then perform funcA on a[x] 
if 40 < a[x] <= 80 then perform funcB on a[x] 
if a[x] <= 40 then perform funcC on a[x] 

¿Cuál es la manera más limpia para realizar esto utilizando funciones numpy?

+0

¿Puede 'funcA()' etc. expresarse en términos de NumPy ufuncs? ¿Qué hacen estas funciones? –

+0

¿Qué pasa con el mapa? – nmichaels

Respuesta

14

Normalmente, intenta evitar los bucles de Python sobre las matrices NumPy, por eso utiliza NumPy en primer lugar. Por el bien del ejemplo, supongo que funcA() agrega 1 a todos los elementos, funcB() agrega 2 y funcC() agrega 3 (por favor elabore lo que realmente hacen para un ejemplo más a medida). Para lograr lo que desea, usted puede hacer esto:

subset_a = a > 80 
subset_b = (40 < a) & (a <= 80) 
subset_c = a <= 40 
a[subset_a] += 1 
a[subset_b] += 2 
a[subset_c] += 3 

Este utiliza NumPy advanced indexing. Por ejemplo, a > 80 evalúa una matriz de valores booleanos que se pueden usar para seleccionar las entradas en la matriz que cumple la condición.

+1

¿Realmente puedes hacer 'a [40 mtrw

+0

@mtrw: tienes razón, arreglado. –

+0

Mi numpy arroja un error sobre 'y': a = np.array ([10,30,50, 20, 10, 90, 0, 25]); subset_b = 40 Spacedman

3

me gusta esto:

b = np.empty(a.shape) 
b[a < 40] = funcA(a[a < 40]) 
b[(a > 40) & (a <= 80)] = funcB(a[(a > 40) & (a <= 80)]) 
b[a > 80] = funcC(a[a > 80]) 

Esto evita un comportamiento extraño cuando funcA establece un elemento de a que habían sido 39 a 41, por ejemplo, con lo que en el rango de funcB.

+0

Evité hacer esto porque crea copias, realiza las acciones en los datos copiados y las copias nuevamente para almacenar los datos. –

8

Mira numpy.piecewise. Creo que desee:

np.piecewise(a, [a > 80, (40 < a) & (a <= 80), a <= 40], [funcA, funcB, funcC]) 
+0

Esto también copia todo dos veces, pero me gusta de todos modos. –

0

Si necesita funciones más complejas se puede utilizar

 newfunc=numpy.vectorize(lambda x: func(x)) 
     result=newfunc(yourArray) 

donde func (x) es su función.

Cuestiones relacionadas