Je pense que vous avez frappé un problème où une méthode différente et certains a priori de la connaissance de la matrice serait vraiment aider. Le genre de chose où vous avez un X probabilité de trouver votre réponse dans la première Y pour cent des données. Le fractionnement le problème avec l'espoir d'obtenir de la chance alors, faire en python avec une liste imbriquée de compréhension ou de quelque chose.
Écrire une fonction C pour ce faire, la force brute n'est pas trop dur à l'aide de ctypes .
Le code C j'ai bidouillé (index.c):
long index(long val, long *data, long length){
long ans, i;
for(i=0;i<length;i++){
if (data[i] == val)
return(i);
}
return(-999);
}
et le python:
# to compile (mac)
# gcc -shared index.c -o index.dylib
import ctypes
lib = ctypes.CDLL('index.dylib')
lib.index.restype = ctypes.c_long
lib.index.argtypes = (ctypes.c_long, ctypes.POINTER(ctypes.c_long), ctypes.c_long)
import numpy as np
np.random.seed(8675309)
a = np.random.random_integers(0, 100, 10000)
print lib.index(57, a.ctypes.data_as(ctypes.POINTER(ctypes.c_long)), len(a))
et je reçois 92.
Envelopper le python dans une fonction appropriée et là vous allez.
La version C est beaucoup (~20x plus rapide de cette graine (attention je ne suis pas bon avec timeit)
import timeit
t = timeit.Timer('np.where(a==57)[0][0]', 'import numpy as np; np.random.seed(1); a = np.random.random_integers(0, 1000000, 10000000)')
t.timeit(100)/100
# 0.09761879920959472
t2 = timeit.Timer('lib.index(57, a.ctypes.data_as(ctypes.POINTER(ctypes.c_long)), len(a))', 'import numpy as np; np.random.seed(1); a = np.random.random_integers(0, 1000000, 10000000); import ctypes; lib = ctypes.CDLL("index.dylib"); lib.index.restype = ctypes.c_long; lib.index.argtypes = (ctypes.c_long, ctypes.POINTER(ctypes.c_long), ctypes.c_long) ')
t2.timeit(100)/100
# 0.005288000106811523