Как я могу быстро сгенерировать (большой) список случайных чисел, учитывая список начальных чисел в качестве входных данPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу быстро сгенерировать (большой) список случайных чисел, учитывая список начальных чисел в качестве входных дан

Сообщение Anonymous »

Мне нужно создать функцию, которая принимает массив целых чисел и возвращает список случайных чисел той же длины, что и массив. Однако существует ограничение: выходное случайное число, соответствующее данной записи во входном массиве, всегда должно быть одинаковым в зависимости от этой записи.
Например, если input_a приведенный ниже возвращает следующее:

Код: Выделить всё

> input_a = np.array([1, 2, 3, 4, 5])
> random_array(input_a)
[0.51689016 0.62747792 0.16585436 0.63928942 0.30514275]
Тогда input_b, указанный ниже, должен вернуть следующее:

Код: Выделить всё

> input_b = np.array([3, 2, 3])
> random_array(input_b)
[0.16585436 0.62747792 0.16585436]
Обратите внимание, что выходные числа, соответствующие входному значению 3, одинаковы, как и те, которые соответствуют входному значению 2. По сути, значения входного массива равны используется в качестве начального числа для выходного массива.
Основная проблема заключается в том, что входные массивы могут быть очень большими, поэтому мне нужно что-то, что может эффективно выполнять эту операцию.Моя наивная реализация заключается в следующем: я создаю список генераторов случайных чисел с входным массивом в качестве начального числа.

Код: Выделить всё

import numpy as np

def random_array(input_array):
rng_list = [np.random.default_rng(seed=i) for i in input_array]
return [rng.random() for rng in rng_list]

input_a = np.array([1, 2, 3])
input_b = np.array([3, 2, 3])

print(random_array(input_a)) # [0.5118216247002567, 0.2616121342493164, 0.08564916714362436]
print(random_array(input_b)) # [0.08564916714362436, 0.2616121342493164, 0.08564916714362436]
Он работает так, как задумано, но ужасно медленно для того, что мне нужно, что неудивительно, учитывая, что он выполняет цикл над записями массива. Эта реализация занимает около 5 секунд для работы с входным массивом длиной 100 000, и мне нужно будет сделать это для гораздо больших входных данных.
Как я могу это сделать, но не только эффективно?
Измените, чтобы добавить информацию: типичная длина входного массива составляет около 200 миллионов. Диапазон его значений может значительно превышать его длину — np.max(input_a) может исчисляться триллионами — но все его значения можно считать неотрицательными. Количество повторяющихся значений невелико по сравнению с длиной массива.
Что я конкретно пытаюсь сделать, так это взять набор частиц из результатов моделирования (всего около 200 миллиардов частиц) и создать меньший набор частиц, случайно выбранных («с пониженной дискретизацией») из большого набора (выходные данные с пониженной дискретизацией должны содержать около 1% от общего числа частиц). Каждая частица помечена идентификатором, который неотрицательен, но может быть очень большим. Результаты моделирования разбиваются на дюжину или около того «снимков», каждый из которых хранит положение каждой частицы (помимо прочего); каждый снимок разделен на «подснимки», отдельные файлы, в которых хранятся идентификаторы/позиции и т. д. около 200 миллионов частиц каждая. Идентификаторы частиц в снимке уникальны, но одна и та же частица (с одним и тем же идентификатором) естественным образом появится в нескольких снимках.
Я пытаюсь создать маску, которая будет решать следует ли сохранять частицу или нет, в зависимости от ее идентификатора. Идея состоит в том, что если частица сохраняется в одном снимке, она должна сохраняться и во всех снимках. Оперативная память не бесконечна; Одновременно можно загрузить только один субснимок информации о частицах. Частицы в N-м подснимке данного снимка такие же, как частицы в N-м подснимке другого снимка, но не обязательно в том же порядке. Файлы поиска в принципе можно сохранять и читать, но, опять же, за раз можно использовать только один субснимок (и это медленно, поэтому, если есть лучший способ, это было бы идеально).
Это Это мотивация создания функции, которая присваивает значение ГСЧ многим частицам одновременно (значение ГСЧ используется для определения, будет ли частица сохранена или нет), которая основана на входном массиве (массив идентификаторов частиц) и согласуется с ним. , чтобы гарантировать, что если частица сохраняется, то она всегда сохраняется).

Подробнее здесь: https://stackoverflow.com/questions/790 ... st-of-seed
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»