Python3中的set-wise组合

时间:2017-11-23 10:40:37

标签: numpy python-3.6

我有四组(在本例中为a-d),我想迭代所有组合的限制,你只能从每组中选择一个元素,你需要从所有组中选择一个。在四组的情况下,你可以简单地做这样的事情:

for a in (1,2):
    for b in (3,4):
        for c in (5,6):
            for d in (7,8):
                print(a,b,c,d)

预期的输出是:

1 3 5 7
1 3 5 8
1 3 6 7
1 3 6 8
1 4 5 7
1 4 5 8
1 4 6 7
1 4 6 8
2 3 5 7
2 3 5 8
2 3 6 7
2 3 6 8
2 4 5 7
2 4 5 8
2 4 6 7
2 4 6 8

我怎样才能为n-sets重写这个?

我希望像itertools.combinations()这样的东西。或者迭代n维数组。可能是nympy有东西吗?

由于

2 个答案:

答案 0 :(得分:1)

以下是numpy解决方案:

a = tuple(np.arange(x,x+2) for x in range(0,8,2))
a
# (array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]))
for x,y,z,u in np.broadcast(*np.ix_(*a)):
    print(x,y,z,u) 
# 0 2 4 6
# 0 2 4 7
# 0 2 5 6
# 0 2 5 7
# 0 3 4 6
...

答案 1 :(得分:0)

正如Paul Panzer在评论中所建议的那样。这是itertools.product(),示例如下所示:

import itertools
for p in itertools.product((1,2), (3,4), (5,6), (7,8)):
    print(p)

(1, 3, 5, 7)
(1, 3, 5, 8)
(1, 3, 6, 7)
(1, 3, 6, 8)
(1, 4, 5, 7)
(1, 4, 5, 8)
(1, 4, 6, 7)
(1, 4, 6, 8)
(2, 3, 5, 7)
(2, 3, 5, 8)
(2, 3, 6, 7)
(2, 3, 6, 8)
(2, 4, 5, 7)
(2, 4, 5, 8)
(2, 4, 6, 7)
(2, 4, 6, 8)