如何获得 python 中一组数组的每个组合

How can I get each combination of a set of arrays in python

我怎样才能(有效地)将一组一维数组的每个组合转化为一个二维数组? 假设我有数组 ABCD,我想用每个组合创建一个二维数组,这样我就有了代表 AB, AC, AD, ABC, ABD, ..., CD.

为了清楚我上面的符号:

A = np.array([1,2,3,4,5])
B = np.array([2,3,4,5,6])
C = np.array([3,4,5,6,7])

所以

AB = np.array([1,2,3,4,5], [2,3,4,5,6])
ABC = np.array([1,2,3,4,5], [2,3,4,5,6],[3,4,5,6,7])

到目前为止,我已经尝试过类似的方法:

A = np.array([1,2,3,4,5])
B = np.array([2,3,4,5,6])
C = np.array([3,4,5,6,7])
D = np.array([4,5,6,7,8])

stacked = np.vstack((A,B,C,D), axis=0)
combos = []
it2 = itertools.combinations(range(4), r=2)
for i in list(it2):
    combos.append(i)
it3 = itertools.combinations(range(4), r=3)
for i in list(it3):
    combos.append(i)
it4 = itertools.combinations(range(4), r=4)
for i in list(it4):
    combos.append(i)

这让我得到了所有可能组合的列表。然后我可以应用类似的东西:

for combo in combos:
    stacked[combo,:]
    #Then I do something with each combo

这就是我卡住的地方 这在只有 A,B,C,D 时很好,但如果我有 A,B,C,... X,Y,Z,那么上面的方法就无法扩展,因为我必须调用 itertools 20 多次。 我怎样才能克服这个问题并使其更加灵活(实际上数组的数量可能是 5-10 个)?

当你有 N 个项目时,有 2^N 种组合,所以这将需要 2^N 次迭代。

如果对范围 0 <= n < (2^N) 使用 for 循环并使用按位运算 select 来自根据当前 n.

的项目列表

您可以使用额外的外部 for 循环:

arrays = np.array([  # let's say your input arrays are stored as one 2d array
    [1, 2, 3, 4, 5],
    [2, 3, 4, 5, 6],
    ...
])

combos = []
for r in range(2, len(arrays)+1):
    combos.extend(it.combinations(range(len(arrays)), r=r))

你可以试试这个:

from itertools import combinations

A = np.array([1,2,3,4,5])
B = np.array([2,3,4,5,6])
C = np.array([3,4,5,6,7])

lst = [A,B,C]
[list(combinations(lst, i)) for i in range(1,len(lst)+1)]

输出:

# [[(array([1, 2, 3, 4, 5]),),
#   (array([2, 3, 4, 5, 6]),),
#   (array([3, 4, 5, 6, 7]),)],
#  [(array([1, 2, 3, 4, 5]), array([2, 3, 4, 5, 6])),
#   (array([1, 2, 3, 4, 5]), array([3, 4, 5, 6, 7])),
#   (array([2, 3, 4, 5, 6]), array([3, 4, 5, 6, 7]))],
#  [(array([1, 2, 3, 4, 5]), array([2, 3, 4, 5, 6]), array([3, 4, 5, 6, 7]))]]

正如其他人也推荐的那样,使用itertools.combinations

import numpy as np

from itertools import combinations

A = np.array([1,2,3,4,5])
B = np.array([2,3,4,5,6])
C = np.array([3,4,5,6,7])

arrays = [A, B, C]

combos = []
for i in range(2, len(arrays) + 1):
    combos.extend(combinations(arrays, i))

for combo in combos:
    arr = np.vstack(combo)  # do stuff with array