У меня есть список из 10 значений:
variable=[2.1, 5.3, 4.1, 6.7, 2, 6.6, 1.9, 4.51, 4, 7.15]
Его длина:
>>> len(variable)
10
Его среднее значение:
>>> mean(variable)
4.436
Его стандартное отклонение:
>>> np.std(variable)
1.8987269419271429
Из него я хочу сгенерировать new_variable
, имеющий len(new_variable)==100
и нормально распределенный, где mean==4.436
и np.std==1.898
.
Вы можете использовать функцию random.gauss:
1 образец:
import random
x = random.gauss(4.436, 1.898)
или 100 образцов:
import random
x = [random.gauss(4.436, 1.898) for _ in range(100)]
Это стандартная библиотека, ничего устанавливать не нужно. Вас также может заинтересовать библиотека статистики.
Спасибо, random.gauss
лучший метод, когда диапазон становится слишком большим?
Так и должно быть, пока вы остаетесь в пределах чисел с плавающей запятой
Эта функция достигает именно того, что вы просили, путем преобразования случайно сгенерированного распределения.
from statistics import NormalDist, mean, stdev
def get_target_dist(target_mean, target_std, size):
dist = NormalDist(target_mean, target_std).samples(size)
dist_mean, dist_std = mean(dist), stdev(dist)
dist_standard = [(val - dist_mean) / dist_std for val in dist]
dist_scaled = [val * target_std + target_mean for val in dist_standard]
return dist_scaled
dist = get_target_dist(4.436, 1.898, 100)
print("len:", len(dist))
print("mean:", mean(dist))
print("std:", stdev(dist))
# len: 100
# mean: 4.436
# std: 1.898
Спасибо и добро пожаловать в ТАК, работает ли get_target_dist
, когда size
больше?
Привет, @KhaledDELLAL, спасибо! Конечно, просто выполните, например. "dist = get_dist(4.436, 1.898, 1000)" и проверьте результат;)
Проверьте numpy.random.randn или scipy.stats, если вы хотите точного управления.