Я предполагаю, что вы ищете решение для numpy, а не простое понимание списка или цикл.Одним из подходов может быть использование метода скользящее окно для поиска окон соответствующего размера.Вот функция roll_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)
...
Тогда вы можете сделать что-то вроде
>>> 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)
Чтобы сделать это действительно полезным, вам нужно уменьшить его вдоль оси 1, используя all
:
>>> numpy.all(rolling_window(a, 3) == [8, 4, 0], axis=1)
array([False, False, False, True, False, False, False, False], dtype=bool)
Тогда вы можете использовать это, как если бы вы использовали логический массив.Простой способ получить индекс:
>>> bool_indices = numpy.all(rolling_window(a, 3) == [8, 4, 0], axis=1)
>>> numpy.mgrid[0:len(bool_indices)][bool_indices]
array([3])
Для списков вы можете адаптировать один из этих скользящих окон итераторов для использования аналогичного подхода.
Для очень большие массивы и подмассивы, вы можете сэкономить память следующим образом:
>>> 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]),)
С другой стороны, это, вероятно, будет медленнее.Насколько медленнее не ясно без тестирования;см. Jamie о другой опции сохранения памяти, которая должна проверять ложные срабатывания.Я полагаю, что разница в скорости между этими двумя решениями будет сильно зависеть от характера ввода.