Ваша лучшая ставка - что-то вроде np.unpackbits
в сочетании с питоном random.sample
. random.sample
будет производить выборку без замены без создания списка входных данных. Это означает, что вы можете использовать объект range
над сколь угодно большими целыми числами без риска возникновения проблем, если размер выборки помещается в памяти. np.unpackbits
затем преобразует целые числа в уникальные битовые последовательности. Эта идея является конкретной реализацией ответа @ ScottHunter .
batch_size = number_of_bits
input_size = number_of_samples
Сначала определите, сколько байтов вам нужно сгенерировать, и максимальное целое число, которое вам нужно покрыть. диапазон. Помните, что Python поддерживает произвольные целые числа точности, поэтому сходите с ума:
bytes_size = np.ceil(batch_size / 8)
max_int = 1<<batch_size
Теперь получите ваши уникальные образцы:
samples = random.sample(range(max_int), input_size)
Целые числа Python - полноценные объекты с to_bytes
метод, который подготовит ваши семплы к np.unpackbits
:
data = np.array([list(x.to_bytes(bytes_size, 'little')) for x in samples], dtype=np.uint8).T
Порядок байтов имеет значение, если batch_size
не кратно 8: собирались урезать конечный массив до размера.
Теперь распакуйте, и все готово:
result = np.unpackbits(data, axis=0)[:batch, :]
Соберите все это в одну упаковку:
def random_bit_columns(batch_size, input_size):
samples = random.sample(range(1 << batch_size), input_size)
data = np.array([list(x.to_bytes(np.ceil(batch_size / 8), 'little')) for x in samples], dtype=np.uint8).T
result = np.unpackbits(data, axis=0)[:batch, :]
return result
Боюсь, я не вижувыход из использования понимания списка по количеству столбцов, если вы хотите получить выгоду от произвольных прецизионных целых чисел python.