Numpy векторизация: найти пересечение между списком и списком списков - PullRequest
1 голос
/ 31 мая 2019

Я пытаюсь найти пересечение между списком и списком списков. Это тривиально решается простым циклом for:

def find_intersec(x,y):
    result = []

    for i in range(len(y)):
        if set(x).intersection(set(y[i])):
            result.append(y[i])

    return(result)

x = [1,2,3,4,5,6]
y = [[1,2,3], [4,5,6], [9,10,11]]



find_intersec(x,y)

Как я могу изменить вышеперечисленное в решение по векторизации? Я пытался numpy.intersect1d() безуспешно.

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Как вы упомянули, numpy.intersect1d() может использоваться:

import numpy as np

x = [1,2,3,4,5,6]
y = [[1,2,3], [4,5,6], [9,10,11]]

intersec = [np.intersect1d(i, x) for i in y if len(np.intersect1d(i, x)) > 0]

результат:

[array([1, 2, 3]), array([4, 5, 6])]
1 голос
/ 31 мая 2019

У вас может быть такая функция:

import numpy as np

def find_intersec_vec(x, y):
    y_all = np.concatenate(y)
    y_all_in = np.isin(y_all, x)
    splits = np.cumsum([0] + [len(lst) for lst in y])
    y_in = np.logical_or.reduceat(y_all_in, splits[:-1])
    return [lst for lst, isin in zip(y, y_in) if isin]

Тест:

x = [1, 2, 3, 4, 5, 6]
y = [[1, 2, 3], [4, 5], [6, 7], [8, 9, 10, 11]]
print(find_intersec(x, y))
# [[1, 2, 3], [4, 5], [6, 7]]
print(find_intersec_vec(x, y))
# [[1, 2, 3], [4, 5], [6, 7]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...