为 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]])
虽然使用第二个参数 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]])
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
我正在尝试编写一些代码,以针对不同数量的输入为我提供 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]])
虽然使用第二个参数 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]])
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