vectores una tutorial transpuesta transponer multiplicar multiplicacion matriz matrices espaƱol arreglos python filter numpy threshold

tutorial - transpuesta de una matriz en python numpy



Filtro de umbral eficiente de una matriz con numpy (2)

Para añadir a

@yosukesabai

respuesta, es importante usar variable diferente ya que esto devolverá una matriz vacía:

im=im[im>167]

No puedo explicar por qué, tal vez es porque estoy demasiado cansado para pensar :(

Necesito filtrar una matriz para eliminar los elementos que son inferiores a un cierto umbral. Mi código actual es así:

threshold = 5 a = numpy.array(range(10)) # testing data b = numpy.array(filter(lambda x: x >= threshold, a))

El problema es que esto crea una lista temporal, usando un filtro con una función lambda (lenta).

Como esta es una operación bastante simple, tal vez hay una función numpy que lo hace de una manera eficiente, pero no he podido encontrarlo.

He pensado que otra forma de lograr esto podría ser ordenar la matriz, encontrar el índice del umbral y devolver una porción de ese índice en adelante, pero incluso si esto fuera más rápido para las entradas pequeñas (y no se notará de todos modos ), es definitivamente menos eficiente a medida que aumenta el tamaño de entrada.

¿Algunas ideas? ¡Gracias!

Actualización : también realicé algunas mediciones, y la clasificación + división fue dos veces más rápida que el filtro de python puro cuando la entrada era 100.000.000 de entradas.

In [321]: r = numpy.random.uniform(0, 1, 100000000) In [322]: %timeit test1(r) # filter 1 loops, best of 3: 21.3 s per loop In [323]: %timeit test2(r) # sort and slice 1 loops, best of 3: 11.1 s per loop In [324]: %timeit test3(r) # boolean indexing 1 loops, best of 3: 1.26 s per loop


b = a[a>threshold] esto debería hacer

Probé de la siguiente manera:

import numpy as np, datetime # array of zeros and ones interleaved lrg = np.arange(2).reshape((2,-1)).repeat(1000000,-1).flatten() t0 = datetime.datetime.now() flt = lrg[lrg==0] print datetime.datetime.now() - t0 t0 = datetime.datetime.now() flt = np.array(filter(lambda x:x==0, lrg)) print datetime.datetime.now() - t0

tengo

$ python test.py 0:00:00.028000 0:00:02.461000

http://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays