Самый быстрый способ создания n подсписков (каждый произвольного размера) исходного списка без генерации всего набора мощности? - PullRequest
0 голосов
/ 13 апреля 2020

Я чувствую, что этот вопрос, должно быть, задавали раньше, но я не мог найти то, что ищу. У меня есть python список S из 100 уникальных целых чисел по величине 10^100. Я хочу, чтобы самый быстрый способ для отбора n элементов из его набора мощности. Другими словами, я хочу n уникальных подсписков произвольной длины. Это может быть сделано путем генерации 2^n подмножеств и выбора из них, но это нереально и очень медленно. Я пробовал такие вещи в al oop,

S[np.random.choice(S.shape[0], np.random.randint(S.shape[0]), replace=False)]

Но это медленно и имеет коллизии. Еще я попробовал использовать Subsets.random_element () SageMath в al oop. Это лучше при семплировании без столкновений, но l oop делает его медленным.

Итак, каков самый быстрый способ из python получить n семплов из набора мощности (списка мощности? ) списка уникальных целых чисел.

Это узкое место в проблеме, которую я пытаюсь решить, любая библиотека или методика, которые могут выполнить sh выборку из блока питания, выполнимо и быстро, улучшат общую скорость для мое решение.

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете сгенерировать n логических масок:

n = 4
masks = np.random.randint(2, size=(n,100), dtype=np.bool)
sets = [*map(lambda x: a[x], masks)] # a.shape=(100)

Вы можете проверить уникальность масок, выполнив следующее:

len(np.apply_along_axis(lambda x: x.tostring(), 1, masks)) == n

Но вероятность настолько мала, что я не смогу не беспокоить.

...