Эквивалент NumPy itertools.product()
равен 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: Просто упомянуть об этом: вызов numpy.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)]
Это стало совершенно нечитаемым - просто скажи мне, должен ли я объяснить это дальше:)