旨在生成[[((0,0),0),((0,1),0),((1,0),0),((1,1),0)]的代码实际上给出了[0 ,0,0,1,1,0,1,1],如何解决?

时间:2019-08-09 10:34:04

标签: python numpy

我正在尝试生成{0,1}和{00,01,10,11}的所有可能组合的集合,该组合应该是形状为(16,4)的数组

类似

[[((0,0),0), ((0,1),0), ((1,0),0), ((1,1),0)],
[((0,0),0), ((0,1),0), ((1,0),0), ((1,1),1)],
...
[((0,0),1), ((0,1),1), ((1,0),1), ((1,1),1)],
...
]]

这实际上不必是数组,因为列表没有形状,所以我误用了术语数组:)

'00'很好,(0,0)更好,因为后者看起来不错,

注意:应该在外部列表中包含16个项目,在内部列表中包含4个项目

代码可以给出最小的块

bset = np.array([0,1])
fset = np.array(np.meshgrid(bset,bset)).T.reshape(-1,2)
[tuple(i) for i in fset]

[(0, 0), (0, 1), (1, 0), (1, 1)]

到目前为止,太酷了,然后事情变得一团糟。

此代码

np.array(np.meshgrid(t4,bset), np.object)

给予

array([[[0, 0, 0, 1, 1, 0, 1, 1],
        [0, 0, 0, 1, 1, 0, 1, 1]],

       [[0, 0, 0, 0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1, 1, 1, 1]]], dtype=object)

除了类似的东西

[((0,0),0), ((0,1),0), ((1,0),0), ((1,1),0)]

我也尝试过itertools

arr = [(0, 0), (0, 1), (1, 0), (1, 1)]
list(combinations(arr, 2))

很近

[((0, 0), (0, 1)),
 ((0, 0), (1, 0)),
 ((0, 0), (1, 1)),
 ((0, 1), (1, 0)),
 ((0, 1), (1, 1)),
 ((1, 0), (1, 1))]

该如何解决?

2 个答案:

答案 0 :(得分:0)

您可以不使用numpy来实现。假设您有两个这样的列表:

>>> l1 = ['0', '1']
>>> l2 = ['00','01','10','11']  # using string as your question is unclear, see below

您可以像这样使用itertools.product

>>> import itertools
>>> result = list(itertools.product(l1, l2))
>>> result
[('0', '00'), ('0', '01'), ('0', '10'), ('0', '11'), ('1', '00'), ('1', '01'), ('1', '10'), ('1', '11')]

itertools.product返回一个可迭代的对象。

在我们的问题中,您的输入集为{00,01,10,11},在输出中,您想要(0, 0),..是错字吗?

您也可以在itertools.product上执行set,但是您在问题中提供的设置不是有效的python代码。

您的问题仍然不清楚输入,但我认为是:

set1 = {0, 1}
set2 = {(0, 0, ), (0, 1, ), (1, 0, ), (1, 1, )}  # if you have a string or something else, convert it to tuple

然后您可以使用类似这样的内容:

import pprint
result = [list(itertools.product(set2, [x])) for x in set1]
pprint.pprint(result)

输出:

[[((0, 1), 0), ((1, 0), 0), ((0, 0), 0), ((1, 1), 0)],
 [((0, 1), 1), ((1, 0), 1), ((0, 0), 1), ((1, 1), 1)]]

答案 1 :(得分:0)

您可以通过以下方式使用itertools.product

>>> options = (0, 1)
>>> base = list(it.product(options, options))
>>> output = [list(zip(base, i)) for i in it.product(*[options]*4)]
>>> pprint(output)
[[((0, 0), 0), ((0, 1), 0), ((1, 0), 0), ((1, 1), 0)],
 [((0, 0), 0), ((0, 1), 0), ((1, 0), 0), ((1, 1), 1)],
 [((0, 0), 0), ((0, 1), 0), ((1, 0), 1), ((1, 1), 0)],
 [((0, 0), 0), ((0, 1), 0), ((1, 0), 1), ((1, 1), 1)],
 [((0, 0), 0), ((0, 1), 1), ((1, 0), 0), ((1, 1), 0)],
 [((0, 0), 0), ((0, 1), 1), ((1, 0), 0), ((1, 1), 1)],
 [((0, 0), 0), ((0, 1), 1), ((1, 0), 1), ((1, 1), 0)],
 [((0, 0), 0), ((0, 1), 1), ((1, 0), 1), ((1, 1), 1)],
 [((0, 0), 1), ((0, 1), 0), ((1, 0), 0), ((1, 1), 0)],
 [((0, 0), 1), ((0, 1), 0), ((1, 0), 0), ((1, 1), 1)],
 [((0, 0), 1), ((0, 1), 0), ((1, 0), 1), ((1, 1), 0)],
 [((0, 0), 1), ((0, 1), 0), ((1, 0), 1), ((1, 1), 1)],
 [((0, 0), 1), ((0, 1), 1), ((1, 0), 0), ((1, 1), 0)],
 [((0, 0), 1), ((0, 1), 1), ((1, 0), 0), ((1, 1), 1)],
 [((0, 0), 1), ((0, 1), 1), ((1, 0), 1), ((1, 1), 0)],
 [((0, 0), 1), ((0, 1), 1), ((1, 0), 1), ((1, 1), 1)]]