Разделяя время выполнения, я не думаю, что метод грубой силы, который вы опубликовали, соответствует тому, что вы описываете словами:
Мне нужно найти строки в другом двумерном массиве, где каждая строка первого массива присутствует.
Ваш код в лучшем случае находит все строки там хотя бы одна строк массива 1D присутствует в строке2D-массив.
Следующий код выполняет то, что вы просили в словах, используя регулярное выражение.
import re
pattern = r'*'.join(map(re.escape, np.sort(gene_name_list)))
rows = [''.join(np.sort(x)) for x in fully_split]
res = [re.search(pattern, r) for r in rows]
Поскольку порядок не имеет значения, gene_name_list
лексикографически сортируется, и строки объединяются с использованиемрегулярное выражение специальный символ '*'
в качестве разделителя. Это шаблон, в котором будет производиться поиск.
Затем каждая строка двумерного массива fully_split
снова будет лексикографически отсортирована, и строки будут объединены в одну строку. Поиск по регулярному выражению выполняется в каждой строке, чтобы проверить, есть ли совпадение.
res
- это список, вы получаете None
для тех строк, где совпадение не найдено, и соответствующее MatchObject
совпадение найдено.
Это иллюстрирует концепцию. Чтобы быть ближе к ожидаемому результату (где вы храните первый элемент строки), замените последнюю строку на:
res = [l[0] if re.search(pattern, r) else None for r, l in zip(rows, fully_split)]