Как создать массив случайных данных NP по возрасту против времени? - PullRequest
0 голосов
/ 07 мая 2018

Как создать случайный массив данных np по возрасту и времени?

Моя цель - создать точечный график, представляющий случайные данные о возрасте и времени, проведенном за просмотром телевизора.

from pylab import randn

X = randn(500)
Y = randn(500)
plt.scatter(X,Y)
plt.show()

Я хочу возраст от 18 до 50 и время от 0 до 24 часов

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Вы можете попробовать:

import random
import numpy as np
age=np.array(random.sample(list(range(18,51)),10))
time=np.array(random.sample(list(range(0,24)),10))

random.sample принимает список элементов в качестве первого аргумента и количество выборок, которое вы хотите в качестве второго аргумента.

Это дает:

age  : [47 45 37 19 23 34 39 24 32 42]
time : [18 12 13  1 15 21 23 22  3 17]

На графике:

import matplotlib.pyplot as plt
plt.scatter(age, time)
plt.show()

enter image description here

Чтобы воссоздавать одни и те же случайные числа при каждом запуске, вы можете использовать random.seed()

0 голосов
/ 07 мая 2018

Умножение по столбцам в numpy

Вы можете легко создавать произвольные массивы произвольного размера с numpy с помощью команд numpy.random.rand(d0, d1, …, dn) для равномерного распределения или numpy.random.randn(d0, d1, …, dn) для нормального распределения, где dn - это числообразцов в n-м измерении.В вашем случае у вас будет d0=500 и d1=2.

Однако значения будут выбраны из интервала [0, 1) в numpy.random.rand(d0, d1, …, dn).Или стандартное нормальное распределение для numpy.random.randn(d0, d1, …, dn) (т. Е. Среднее = 0 и дисперсия = 1).

Хорошим решением для этого является суммирование и умножение массивов по столбцам, чтобы сдвинуть распределения к желаемым значениям.Чтобы умножить по столбцам массив arr с вектором vec, вы можете использовать этот небольшой фрагмент кода arr.dot(np.diag(vec)).Будьте осторожны, в vec должно быть столько же элементов, сколько в столбцах arr.

Этот фрагмент работает путем преобразования vec в диагональную матрицу (т. Е. Матрицу, в которой все равно нулю, кроме главной диагонали) иумножение arr на диагональную матрицу.

Для равномерных распределений

Помните, что, чтобы превратить выборку x из равномерного распределения [0, 1) в [min, max), вы делаете new_x = (max - min) * x + min.Поэтому, если вам нужно равномерное распределение и вы знаете максимальные и минимальные пределы для обеих переменных, вы можете использовать следующий код:

import numpy as np

n_samples = 500
max_age, min_age = 80, 10
max_hours, min_hours = 10, 0

array = np.random.rand(n_samples, 2)  #returns samples from the uniform distribution
range_vector = np.array([max_age - min_age, max_hours - min_hours])
min_vector = np.array([min_age, min_hours])

sample = array.dot(np.diag(range_vector)) + np.ones(array.shape).dot(np.diag(min_vector))

Нормальные распределения

Если вы хотите нормальное распределениераспределение и вы знаете среднее значение и дисперсию обоих столбцов используйте следующий код.Помните, что для смещения выборки x от стандартного нормального распределения к распределению с другим средним и стандартным отклонением вы идете new_x = deviation * x + mean.

import numpy as np

n_samples = 500
mean_age, deviation_age = 40, 20
mean_hours, deviation_hours = 5, 2

array = np.random.rand(n_samples, 2)  #returns samples from the standard normal distribution
deviation_vector = np.array([deviation_age, deviation_hours])
mean_vector = np.array([mean_age, mean_hours])

sample = array.dot(np.diag(deviation_vector)) + np.ones(array.shape).dot(np.diag(mean_vector))

Однако будьте осторожны, с обычными распределениями вы можетев конечном итоге получим отрицательные значения.

Вы также можете просмотреть всю документацию, которую numpy имеет по случайным переменным: https://docs.scipy.org/doc/numpy/reference/routines.random.html

Наконец, обратите внимание, что умножение по столбцам работает только тогда, когда вы хотитеоба образца должны быть независимыми.

0 голосов
/ 07 мая 2018

Это супер просто с numpy. Для этого вы можете использовать библиотеку numpy:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

age = np.random.randint(18, 50, 20)
time = np.random.randint(0, 24, 20)

plt.scatter(age, time)
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...