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

repeating a numpy array a specified number of times for 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)])

但都没有给我想要的结果。当然有一个简单的方法可以做到这一点。如果有任何帮助,我将不胜感激。

在我看来,您似乎掌握了 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]])

虽然使用第二个参数 repeatitertools.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]])

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)])

您需要添加*来扩展列表列表:

In [244]: list(itertools.product(*[[0,2]]*2))
Out[244]: [(0, 0), (0, 2), (2, 0), (2, 2)]

这个扩展和repeat的使用在计时测试中是一样的。

你可以试试这个

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 前面的* 是解压所有element