NumPy 等价于itertools.product()
is numpy.indices()
,但它只会得到 0,...,k-1 形式的范围的乘积:
numpy.rollaxis(numpy.indices((2, 3, 3)), 0, 4)
array([[[[0, 0, 0],
[0, 0, 1],
[0, 0, 2]],
[[0, 1, 0],
[0, 1, 1],
[0, 1, 2]],
[[0, 2, 0],
[0, 2, 1],
[0, 2, 2]]],
[[[1, 0, 0],
[1, 0, 1],
[1, 0, 2]],
[[1, 1, 0],
[1, 1, 1],
[1, 1, 2]],
[[1, 2, 0],
[1, 2, 1],
[1, 2, 2]]]])
对于您的特殊情况,您可以使用
a = numpy.indices((4,)*13)
b = 1j ** numpy.rollaxis(a, 0, 14)
(这不会在 32 位系统上运行,因为数组太大。从我可以测试的大小推断,它应该在不到一分钟的时间内运行。)
EIDT:顺便提一下:调用 tonumpy.rollaxis()
或多或少是装饰性的,以获得与 . 相同的输出itertools.product()
。如果您不关心索引的顺序,则可以省略它(但只要您没有任何将数组转换为连续数组的后续操作,它无论如何都很便宜。)
EDIT2:获得确切的类似物
numpy.array(list(itertools.product(some_list, repeat=some_length)))
您可以使用
numpy.array(some_list)[numpy.rollaxis(
numpy.indices((len(some_list),) * some_length), 0, some_length + 1)
.reshape(-1, some_length)]
这完全不可读——告诉我是否应该进一步解释:)