Eliminar ciertos elementos de la matriz numpy usando verificaciones condicionales

Quiero eliminar algunas entradas de una matriz numpy que tiene aproximadamente un millón de entradas.

Este código lo haría pero tomaría mucho tiempo:

a = np.array([1,45,23,23,1234,3432,-1232,-34,233]) for element in a: if element100: some delete command. 

¿Puedo hacer esto de otra manera?

Supongo que quiere decir a < -100 or a > -100 , la forma más concisa es utilizar la indexación lógica.

 a = a[(a >= -100) & (a <= 100)] 

Esto no es exactamente "eliminar" las entradas, en lugar de hacer una copia de la matriz menos los valores no deseados y asignarla a la variable que se asignó previamente a la matriz anterior. Después de que esto suceda, la matriz antigua no tiene referencias restantes y se recolecta la basura, lo que significa que su memoria se libera.

Vale la pena señalar que este método no usa memoria constante, ya que hacemos una copia de la matriz, usa memoria lineal en el tamaño de la matriz. Esto podría ser malo si su matriz es tan grande que alcanza los límites de la memoria en su máquina. El proceso de pasar y eliminar cada elemento de la matriz "en su lugar", también conocido como el uso de memoria constante, sería una operación muy diferente, ya que los elementos de la matriz deberían intercambiarse y cambiar el tamaño del bloque de memoria. No estoy seguro de que pueda hacer esto con una matriz numpy , sin embargo, una cosa que puede hacer para evitar copiar es usar una numpy enmascarada numpy :

 import numpy.ma as ma mx = ma.masked_array(a, mask = ((a < -100) | (a > 100)) ) 

Todas las operaciones en la matriz enmascarada actuarán como si los elementos que "eliminamos" no existieran, pero realmente no los "eliminamos", todavía están allí en la memoria, solo hay un registro de qué elementos omitir ahora asociado con la matriz, y nunca necesitamos hacer una copia de la matriz en la memoria. Además, si alguna vez queremos recuperar nuestros valores eliminados, simplemente podemos eliminar la máscara así:

 mx.mask = ma.nomask 

Puede utilizar índice enmascarado con condición inversa.

 >>> a = np.array([1,45,23,23,1234,3432,-1232,-34,233]) >>> a[~((a < -100) | (a > 100))] array([ 1, 45, 23, 23, -34]) >>> a[(a >= -100) & (a <= 100)] array([ 1, 45, 23, 23, -34]) >>> a[abs(a) <= 100] array([ 1, 45, 23, 23, -34]) 
 In [140]: a = np.array([1,45,23,23,1234,3432,-1232,-34,233]) In [141]: b=a[(-100<=a)&(a<=100)] In [142]: b Out[142]: array([ 1, 45, 23, 23, -34])