¿Filtrar filas de una matriz numpy?

Estoy buscando aplicar una función a cada fila de una matriz numpy. Si esta función se evalúa como verdadera, mantendré la fila; de lo contrario, la descartaré. Por ejemplo, mi función podría ser:

def f(row): if sum(row)>10: return True else: return False 

Me preguntaba si había algo similar a:

 np.apply_over_axes() 

que aplica una función a cada fila de una matriz numpy y devuelve el resultado. Esperaba algo como:

 np.filter_over_axes() 

lo que aplicaría una función a cada fila de una matriz numpy y solo devolvería las filas para las cuales la función devolvió verdadero. ¿Hay algo como esto? ¿O debería simplemente usar un bucle for?

Lo ideal sería que pudieras implementar una versión vectorizada de tu función y usarla para hacer indexación booleana . Para la gran mayoría de los problemas, esta es la solución correcta. Numpy proporciona bastantes funciones que pueden actuar sobre varios ejes, así como todas las operaciones básicas y comparaciones, por lo que las condiciones más útiles deberían ser vectorizables.

 import numpy as np x = np.random.randn(20, 3) x_new = x[np.sum(x, axis=1) > .5] 

Si está absolutamente seguro de que no puede hacer lo anterior, sugeriría usar una comprensión de lista (o np.apply_along_axis ) para crear una matriz de bools para indexar.

 def myfunc(row): return sum(row) > .5 bool_arr = np.array([myfunc(row) for row in x]) x_new = x[bool_arr] 

Esto hará el trabajo de una manera relativamente limpia, pero será significativamente más lento que una versión vectorizada. Un ejemplo:

 x = np.random.randn(5000, 200) %timeit x[np.sum(x, axis=1) > .5] # 100 loops, best of 3: 5.71 ms per loop %timeit x[np.array([myfunc(row) for row in x])] # 1 loops, best of 3: 217 ms per loop