Могу ли я узнать, появляется ли один numpy вектор как фрагмент другого? - PullRequest
1 голос
/ 31 января 2020

Я хочу выяснить, появляется ли мой numpy вектор, needle внутри другого вектора, haystack, в виде среза или смежного субвектора.

Мне нужна функция find(needle, haystack) возвращает true тогда и только тогда, когда существуют возможные целочисленные индексы p и q , такие что needle равно haystack[p:q], где "равно" означает, что элементы равны во всех позициях.

Пример:

find([2,3,4], [1,2,3,4,5]) == True
find([2,4], [1,2,3,4,5]) == False  # not contiguous inside haystack
find([2,3,4], [0,1,2,3]) == False  # incomplete

Здесь я использую списки для упрощения иллюстрации, но на самом деле они будут numpy векторов (одномерных массивов).

Для строки в Python, эквивалентная операция тривиальна: это in: "bcd" in "abcde" == True.


Приложение о размерности.

Уважаемый читатель, вас может соблазнить подобное ищущие вопросы, такие как проверка, содержит ли массив Numpy заданную строку , или Проверка, содержит ли массив NumPy другой массив . Но мы можем отклонить это сходство как бесполезное при рассмотрении измерений.

Вектор - это одномерный массив. В терминах numpy вектор длины N будет иметь .shape == (N,); его форма имеет длину 1.

Другие упомянутые вопросы, как правило, направлены на поиск точного соответствия для строки в двумерной матрице.

Я пытаюсь скользить 1 игла вдоль той же оси моего 1-мерного стога сена как окно, пока вся игла не совпадет с частью стога сена это видно через окно.

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Если у вас все в порядке с созданием копий двух массивов, вы можете использовать оператор Python in для байтовых объектов:

def find(a, b):
  return a.tobytes() in b.tobytes()

print(
    find(np.array([2,3,4]), np.array([1,2,3,4,5])),
    find(np.array([2,4]),   np.array([1,2,3,4,5])),
    find(np.array([2,3,4]), np.array([0,1,2,3])),
    find(np.array([2,3,4]), np.array([0,1,2,3,4,5,2,3,4])),
)

# True False False True
0 голосов
/ 31 января 2020

Попробуйте с пониманием списка:

def find(a,x):
    return any([x[i:i+len(a)]==a for i in range(1+len(x)-len(a))])

Выходы:

print(find([2,3,4], [1,2,3,4,5]),
find([2,4], [1,2,3,4,5]),
find([2,3,4], [0,1,2,3]), find([2,3,4], [0,1,2,3,4,5,2,3,4]))
>> True False False True
...