如何获得 python 中一组数组的每个组合
How can I get each combination of a set of arrays in python
我怎样才能(有效地)将一组一维数组的每个组合转化为一个二维数组?
假设我有数组 A
、B
、C
和 D
,我想用每个组合创建一个二维数组,这样我就有了代表 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
我怎样才能(有效地)将一组一维数组的每个组合转化为一个二维数组?
假设我有数组 A
、B
、C
和 D
,我想用每个组合创建一个二维数组,这样我就有了代表 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