Попарное сочетание произвольного набора списков - PullRequest
1 голос
/ 28 мая 2020

Я ищу обобщенный подход, который решает следующую проблему: при произвольном количестве одномерных или многомерных списков (NumPy массивов и т.п.) возвращаются их попарные комбинации.

Следующая попытка приведите пример для трех одномерных списков a, b и c, которые приводят к 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

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Я считаю, что функция itertools.product сделает именно то, что вы хотите. Он принимает итерации в качестве аргументов и формирует кортежи «все для всех», например:

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

Подробную информацию об этом наборе инструментов можно найти здесь .

1 голос
/ 28 мая 2020

itertools.product получил вашу поддержку: https://docs.python.org/3/library/itertools.html#itertools .product

В данном примере это можно использовать так:

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