我正在尝试编写一些代码,这些代码将为我提供itertools产品,用于不同数量的输入。例如,这对我有用。
test = np.array([x for x in itertools.product([0,2],[0,2],[0,2])])
这给了我想要的结果:
>>> test
array([[0, 0, 0],
[0, 0, 2],
[0, 2, 0],
[0, 2, 2],
[2, 0, 0],
[2, 0, 2],
[2, 2, 0],
[2, 2, 2]])
但是,我希望能够将不同数量的列表传递给产品功能。例如:
test = np.array([x for x in itertools.product([0,2],[0,2],[0,2],[0,2])])
或
test = np.array([x for x in itertools.product([0,2],[0,2])])
我试过了
test = np.array([x for x in itertools.product(([0,2],) * 3)])
和
test = np.array([x for x in itertools.product([[0,2]]*3)])
但两者都没有给我预期的结果。当然有一种简单的方法可以做到这一点。我将不胜感激任何帮助。
答案 0 :(得分:3)
在我看来,你正在抓住splat-unpack语法:
>>> n = 3
>>> L = [0, 2]
>>> np.array([x for x in itertools.product(*([L] * n))])
array([[0, 0, 0],
[0, 0, 2],
[0, 2, 0],
[0, 2, 2],
[2, 0, 0],
[2, 0, 2],
[2, 2, 0],
[2, 2, 2]])
虽然可能更容易将第二个参数repeat
用于itertools.product
。
>>> np.array(list(itertools.product(L, repeat=3)))
array([[0, 0, 0],
[0, 0, 2],
[0, 2, 0],
[0, 2, 2],
[2, 0, 0],
[2, 0, 2],
[2, 2, 0],
[2, 2, 2]])
答案 1 :(得分:1)
itertools.product支持另一个名为repeat
的参数,如itertools.product(*iterables[, repeat])
中所示,您可以通过该参数操纵跨产品的维度。注意,应明确指定此参数,以便从列表内容中消除歧义。
所以你的例子延伸到
test = np.array([x for x in itertools.product([0,2],[0,2],[0,2],[0,2])])
到
test = np.array([x for x in itertools.product([0,2], repeat = 4)])
答案 2 :(得分:1)
您需要添加*
以展开列表列表:
In [244]: list(itertools.product(*[[0,2]]*2))
Out[244]: [(0, 0), (0, 2), (2, 0), (2, 2)]
这种扩展以及repeat
在时序测试中的使用是相同的。
答案 3 :(得分:1)
你可以试试这个
3次:
test = np.array([x for x in itertools.product(*itertools.repeat([0,2],3))])
n次:
test = np.array([x for x in itertools.product(*itertools.repeat([0,2],n))])
itertools.repeat([0,2],n)这将重复elem,elem,elem,...无休止地或最多n次和*在itertools前面是解压所有元素