Python Numpy矢量化:查找列表和列表列表之间的交集

Python Numpy矢量化:查找列表和列表列表之间的交集,python,numpy,vectorization,Python,Numpy,Vectorization,我试图找到列表和列表列表之间的交叉点。这可以通过一个简单的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,1

我试图找到列表和列表列表之间的交叉点。这可以通过一个简单的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矢量化解决方案?我尝试了
numpy.intersect1d()
,但没有成功。

您可以使用如下函数:

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]
测试:


正如您所提到的,
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])]

我们是否可以假设
y
在所有内部列表中具有相同数量的元素,即发布的示例中的
3
?否,
y
在内部列表中具有可变数量的元素。
[array([1, 2, 3]), array([4, 5, 6])]