任意列表集的成对组合

Pairwise combination of arbitrary set of lists

我正在寻找解决以下问题的通用方法: 给定任意数量的一维或多维列表(NumPy 数组等)return 它们的成对组合。

以下尝试给出三个一维列表 abc 的示例,结果为 d:

a = np.linspace(0, 1, 1).astype(int)
b = np.linspace(1, 2, 2).astype(int)
c = np.linspace(2, 4, 3).astype(int)

e = np.array([
    (a_, b_, c_)
    for a_ in a
    for b_ in b
    for c_ in c
])

执行时变量设置如下:

# a
[0]

# b
[1 2]

# c
[2 3 4]

# d
[[0 1 2]
 [0 1 3]
 [0 1 4]
 [0 2 2]
 [0 2 3]
 [0 2 4]]

什么是通用方法的好方法?理想情况下,我正在寻找一个函数,该函数接受一个可迭代对象,其元素定义一维或多维列表,如下所示:

def pairwise_combinations(iterable):
    # Insert magic here

itertools.product 得到你的支持:https://docs.python.org/3/library/itertools.html#itertools.product

在给定的示例中,它可以这样使用:

d = np.array(list(itertools.product(a, b, c)))

我相信 itertools.product 函数会完全满足您的要求。它以 iterables 作为参数,并形成 all-to-all 的元组,例如:

> a = [0]
> b = [1, 2]
> c = [2, 3, 4]
> print(list(product(a,b,c)))
[(0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 2), (0, 2, 3), (0, 2, 4)]

可以找到有关该工具集的详细信息here