Я хотел бы попробовать 26-мерное пространство, скажем, с 10 точками в каждом направлении. Это означает, что в общей сложности 10 ** 26 образцов, но я отброшу более 99,9999 ...%. Использование python немедленно приводит к ошибкам памяти.
Первый наивный подход заключается в использовании вложенных циклов:
p = list(range(10))
for p1 in p:
for p2 in p:
...
Однако Python имеет встроенный максимум на количество вложенных циклов: 20.
Лучше всего было бы использовать команду numpy .indices:
import numpy as np
dimensions = (10,)*26
indices = np.indices(*dimensions)
Это происходит с сообщением «слишком большой массив», поскольку Numpy не может вместить все 10 ** 26 индексов в памяти. Понятно.
Мой последний подход состоял в том, чтобы использовать итератор, надеясь, что ему не нужно больше памяти:
import numpy as np
dimensions = (10,)*26
for index in np.ndindex(*dimensions):
# do something with index
Однако, это ТАКЖЕ завершается ошибкой с сообщением "слишком большой массив", так как под капотом Numpy все еще пытается создать плотный массив.
У кого-нибудь еще есть лучший подход?
Спасибо! Том
РЕДАКТИРОВАТЬ: Сообщение "массив слишком большой", вероятно, потому что 10 ** 26 больше, чем максимальное значение, которое может хранить Int64. Если бы вы могли указать Numpy хранить размер как Int128, это могло бы обойти ValueError по крайней мере. Тем не менее, для хранения всех индексов как Int64 все равно потребуется почти 20 ГБ ...