Я хочу создать массив (скажем, output_list
) из заданного numpy (скажем, input_list
) после повторной выборки так, чтобы каждый элемент из input_list
существовал в output_list
хотя бы один раз.Длина output_list
всегда будет> длиной input_list.
Я пробовал несколько подходов, и я ищу более быстрый метод.К сожалению, numpy
random.choice
не гарантирует, что хотя бы один элемент существует.
Шаг 1: Генерация данных
import string
import random
import numpy as np
size = 150000
chars = string.digits + string.ascii_lowercase
input_list= [
"".join(
[random.choice(chars) for i in range(5)]
) for j in range(dict_data[1]['unique_len'])]
Вариант 1: Давайте попробуем numpy
'random.choice
с равномерным распределением в терминахвероятности.
output_list = np.random.choice(
input_list,
size=output_size,
replace=True,
p=[1/input_list.__len__()]*input_list.__len__()
)
assert set(input_list).__len__()==set(output_list).__len__(),\
"Output list has fewer elements than input list"
Это вызывает утверждение:
В списке вывода меньше элементов, чем в списке ввода
Опция 2 Давайте добавим случайные числа к input_list
и затем перемешаем их.
output_list = np.concatenate((np.array(input_list),np.random.choice(
input_list,
size=output_size-input_list.__len__(),
replace=True,
p=[1/input_list.__len__()]*input_list.__len__()
)),axis=None)
np.random.shuffle(output_list)
assert set(input_list).__len__()==set(output_list).__len__(),\
"Output list has fewer elements than input list"
Хотя это не вызывает никаких утверждений, я ищу более быстрое решение, чем это, либо алгоритмически, либо с использованием встроенной функции numpy
.
Спасибо за любую помощь.