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