vectores una transpuesta multiplicar matriz matrices funciones elementos ejemplos arreglos array agregar python performance numpy

python - transpuesta - ¿Cuál es la forma más eficiente de verificar si existe un valor en una matriz NumPy?



transpuesta de una matriz en python numpy (5)

Agregar a la respuesta de @ HYRY parece ser el más rápido para Numpy. Esto está usando numpy 1.8 y python 2.7.6.

En esta prueba, in1d fue el más rápido:

a = arange(0,99999,3) %timeit 10 in a %timeit in1d(a, 10) 10000 loops, best of 3: 150 µs per loop 10000 loops, best of 3: 61.9 µs per loop

El uso de un conjunto de Python parece ser el más rápido:

s = set(range(0, 99999, 3)) %timeit 10 in s 10000000 loops, best of 3: 47 ns per loop

Tengo una matriz NumPy muy grande

1 40 3 4 50 4 5 60 7 5 49 6 6 70 8 8 80 9 8 72 1 9 90 7 ....

Quiero verificar si existe un valor en la primera columna de la matriz. Tengo un montón de formas de cosecha propia (por ejemplo, recorriendo cada fila y comprobando), pero dado el tamaño de la matriz, me gustaría encontrar el método más eficiente.

¡Gracias!


El más obvio para mí sería:

np.any(my_array[:, 0] == value)


Fascinante. Necesitaba mejorar la velocidad de una serie de bucles que deben realizar la determinación del índice coincidente de esta misma manera. Así que decidí cronometrar todas las soluciones aquí, junto con algunos riff''s.

Aquí están mis pruebas de velocidad para Python 2.7.10:

import timeit timeit.timeit(''N.any(N.in1d(sids, val))'', setup = ''import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])'')

18.86137104034424

timeit.timeit(''val in sids'', setup = ''import numpy as N; val = 20010401020091; sids = [20010401010101+x for x in range(1000)]'')

15.061666011810303

timeit.timeit(''N.in1d(sids, val)'', setup = ''import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])'')

11.613027095794678

timeit.timeit(''N.any(val == sids)'', setup = ''import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])'')

7.670552015304565

timeit.timeit(''val in sids'', setup = ''import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])'')

5.610057830810547

timeit.timeit(''val == sids'', setup = ''import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])'')

1.6632978916168213

timeit.timeit(''val in sids'', setup = ''import numpy as N; val = 20010401020091; sids = set([20010401010101+x for x in range(1000)])'')

0.0548710823059082

timeit.timeit(''val in sids'', setup = ''import numpy as N; val = 20010401020091; sids = dict(zip([20010401010101+x for x in range(1000)],[True,]*1000))'')

0.054754018783569336

¡Muy sorprendente! Órdenes de diferencia de magnitud!

Para resumir, si solo quieres saber si hay algo en una lista de 1D o no:

  • 19s N.any (N.in1d ​​(matriz numpy))
  • 15s x in (lista)
  • 8s N.any (x == matriz numpy)
  • 6s x in (matriz numpy)
  • .1s x in (establecer o un diccionario)

Si quieres saber dónde está algo en la lista también (el orden es importante):

  • 12s N.in1d ​​(x, matriz numpy)
  • 2s x == (matriz numpy)

Para verificar valores múltiples, puede usar numpy.in1d ​​(), que es una versión de función de elemento de la palabra clave python. Si sus datos están ordenados, puede usar numpy.searchsorted ():

import numpy as np data = np.array([1,4,5,5,6,8,8,9]) values = [2,3,4,6,7] print np.in1d(values, data) index = np.searchsorted(data, values) print data[index] == values


Qué tal si

if value in my_array[:, col_num]: do_whatever

Editar: Creo que __contains__ se implementa de tal manera que esto es lo mismo que la versión de @ detly