为itertools重复一个numpy数组指定的次数

时间:2015-04-04 03:37:41

标签: python arrays list numpy itertools

我正在尝试编写一些代码,这些代码将为我提供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)])

但两者都没有给我预期的结果。当然有一种简单的方法可以做到这一点。我将不胜感激任何帮助。

4 个答案:

答案 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前面是解压所有元素