【问题标题】:Numpy vectorization: Find intersection between list and list of listsNumpy矢量化:查找列表和列表列表之间的交集
【发布时间】:2019-05-31 19:56:56
【问题描述】:

我正在尝试查找列表和列表列表之间的交集。这可以通过一个简单的 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() 没有成功。

【问题讨论】:

  • 我们能否假设y 在所有内部列表中具有相同数量的元素,即发布示例中的3
  • 不,y 在内部列表中具有可变数量的元素。

标签: python numpy vectorization


【解决方案1】:

你可以有这样的功能:

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]]

【讨论】:

    【解决方案2】:

    正如你所说,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])]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-06
      • 2021-03-18
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多