Например, если 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 = np.array([3, 2, 3])
> random_array(input_b)
[0.16585436 0.62747792 0.16585436]
Основная проблема заключается в том, что входные массивы могут быть очень большими, поэтому мне нужно что-то, что может эффективно выполнять эту операцию.Моя наивная реализация заключается в следующем: я создаю список генераторов случайных чисел с входным массивом в качестве начального числа.
Код: Выделить всё
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]
Как я могу это сделать, но не только эффективно?
Измените, чтобы добавить информацию: типичная длина входного массива составляет около 200 миллионов. Диапазон его значений может значительно превышать его длину — np.max(input_a) может исчисляться триллионами — но все его значения можно считать неотрицательными. Количество повторяющихся значений невелико по сравнению с длиной массива.
Что я конкретно пытаюсь сделать, так это взять набор частиц из результатов моделирования (всего около 200 миллиардов частиц) и создать меньший набор частиц, случайно выбранных («с пониженной дискретизацией») из большого набора (выходные данные с пониженной дискретизацией должны содержать около 1% от общего числа частиц). Каждая частица помечена идентификатором, который неотрицательен, но может быть очень большим. Результаты моделирования разбиваются на дюжину или около того «снимков», каждый из которых хранит положение каждой частицы (помимо прочего); каждый снимок разделен на «подснимки», отдельные файлы, в которых хранятся идентификаторы/позиции и т. д. около 200 миллионов частиц каждая. Идентификаторы частиц в снимке уникальны, но одна и та же частица (с одним и тем же идентификатором) естественным образом появится в нескольких снимках.
Я пытаюсь создать маску, которая будет решать следует ли сохранять частицу или нет, в зависимости от ее идентификатора. Идея состоит в том, что если частица сохраняется в одном снимке, она должна сохраняться и во всех снимках. Оперативная память не бесконечна; Одновременно можно загрузить только один субснимок информации о частицах. Частицы в N-м подснимке данного снимка такие же, как частицы в N-м подснимке другого снимка, но не обязательно в том же порядке. Файлы поиска в принципе можно сохранять и читать, но, опять же, за раз можно использовать только один субснимок (и это медленно, поэтому, если есть лучший способ, это было бы идеально).
Это Это мотивация создания функции, которая присваивает значение ГСЧ многим частицам одновременно (значение ГСЧ используется для определения, будет ли частица сохранена или нет), которая основана на входном массиве (массив идентификаторов частиц) и согласуется с ним. , чтобы гарантировать, что если частица сохраняется, то она всегда сохраняется).
Подробнее здесь: https://stackoverflow.com/questions/790 ... st-of-seed