Zakładam, że szukasz rozwiązania specyficznego dla numpy, a nie prostego rozumienia list lub pętli. Jednym ze sposobów może być użycie techniki rolling window do wyszukania okien o odpowiednim rozmiarze. Oto funkcja rolling_window:
>>> def rolling_window(a, size):
... shape = a.shape[:-1] + (a.shape[-1] - size + 1, size)
... strides = a.strides + (a. strides[-1],)
... return numpy.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
...
Następnie można zrobić coś takiego
>>> a = numpy.arange(10)
>>> numpy.random.shuffle(a)
>>> a
array([7, 3, 6, 8, 4, 0, 9, 2, 1, 5])
>>> rolling_window(a, 3) == [8, 4, 0]
array([[False, False, False],
[False, False, False],
[False, False, False],
[ True, True, True],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False]], dtype=bool)
Aby to naprawdę przydatne, trzeba by zmniejszyć go wzdłuż osi 1, stosując all
:
>>> numpy.all(rolling_window(a, 3) == [8, 4, 0], axis=1)
array([False, False, False, True, False, False, False, False], dtype=bool)
Następnie możesz użyć tego, ale użyjesz tablicy boolowskiej. Prosty sposób, aby uzyskać indeks out:
>>> bool_indices = numpy.all(rolling_window(a, 3) == [8, 4, 0], axis=1)
>>> numpy.mgrid[0:len(bool_indices)][bool_indices]
array([3])
Na listach można przystosować jedną z tych rolling window iteratory używać podobnego podejścia.
Dla bardzo duże tablice i subarrays, można zaoszczędzić pamięć tak:
>>> windows = rolling_window(a, 3)
>>> sub = [8, 4, 0]
>>> hits = numpy.ones((len(a) - len(sub) + 1,), dtype=bool)
>>> for i, x in enumerate(sub):
... hits &= numpy.in1d(windows[:,i], [x])
...
>>> hits
array([False, False, False, True, False, False, False, False], dtype=bool)
>>> hits.nonzero()
(array([3]),)
Z drugiej strony, to prawdopodobnie będzie wolniejszy. Ile wolniej nie jest jasne bez testowania; odpowiedź na Jamie dla innej opcji oszczędzania pamięci, która musi sprawdzić fałszywe alarmy. Wyobrażam sobie, że różnica prędkości pomiędzy tymi dwoma rozwiązaniami będzie zależeć w dużym stopniu od natury danych wejściowych.
Czy możesz po prostu przekształcić listę w ciąg znaków, aby dokonać porównania? 'x = ''. join (str (x) dla x w a)' Następnie użyj metody find z wynikowymi łańcuchami znaków? Czy oni muszą pozostać listami? – danem