Numpy массив с различным стандартным отклонением на строку - PullRequest
5 голосов
/ 22 апреля 2019

Я хотел бы получить матрицу NxM, где числа в каждой строке - это случайные выборки, сгенерированные из разных нормальных распределений (то же самое mean, но с разными стандартными отклонениями). Работает следующий код:

import numpy as np

mean = 0.0 # same mean
stds = [1.0, 2.0, 3.0] # different stds
matrix = np.random.random((3,10))

for i,std in enumerate(stds):
     matrix[i] = np.random.normal(mean, std, matrix.shape[1])

Однако этот код не совсем эффективен, так как задействован цикл for. Есть ли более быстрый способ сделать это?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2019

np.random.normal() векторизовано ;Вы можете переключать оси и транспонировать результат:

np.random.seed(444)
arr = np.random.normal(loc=0., scale=[1., 2., 3.], size=(1000, 3)).T

print(arr.mean(axis=1))
# [-0.06678394 -0.12606733 -0.04992722]
print(arr.std(axis=1))
# [0.99080274 2.03563299 3.01426507]

То есть параметр scale является стандартным отклонением по столбцам , следовательно, необходимо транспонировать через .T, так какВы хотите ввод по строкам.

1 голос
/ 22 апреля 2019

Как насчет этого?

rows = 10000
stds = [1, 5, 10]

data = np.random.normal(size=(rows, len(stds)))
scaled = data * stds

print(np.std(scaled, axis=0))

Выход:

[ 0.99417905  5.00908719 10.02930637]

Это использует тот факт, что два нормальных распределения могут быть преобразованы линейным масштабированием (в данном случае, умножением на стандартное отклонение). В выходных данных каждый столбец (вторая ось) будет содержать нормально распределенную переменную, соответствующую значению в stds.

...