Python генерирует массив диапазонов со случайным размером шага
Цели: Инициализировать массив с заданным размером случайным числом. Я попробовал этот способ и работает:
xa = np.empty(100)
xa[0] = random.random()
for i in range(1,100):
xa[i] = xa[i-1] + random.random()
Мой вопрос: есть ли лучший способ сделать это? может быть, без цикла?
5 ответов
Учитывая, что вы используете numpy, код в вашем вопросе эквивалентен:
import numpy as np
np.random.seed(42)
xa = np.cumsum(np.random.random(100))
print(xa[:5])
Выход
[0.37454012 1.32525443 2.05724837 2.65590685 2.81192549]
Но если то, что вы хотите, если что-то, что возвращает диапазон (например, тот, что из функции диапазона), но со случайным шагом вы можете сделать что-то вроде этого:
xa = np.cumsum(np.random.randint(100, size=(100,)))
print(xa[:5])
Выход
[ 62 157 208 303 306]
Обратите внимание, что в обоих случаях печатаются только первые 5 цифр. Также в обоих случаях шаг положительный.
В дальнейшем
Простой однострочный
import random
xa = random.sample(range(1, 101), 100)
Вы также можете использовать itertools.accumulate
функция:
from itertools import accumulate
import numpy as np
import random
xa = np.empty(100)
xa[0] = random.random()
xa = list(accumulate(xa, lambda x, y: x + random.random()))
Я не совсем уверен, что это то, что вам нужно, но он вычисляет каждый элемент с prev + random.random()
как вы написали в своем вопросе.
Используйте понимание списка:
import random
n = 100 # your array size
xa = [random.random() for _ in range(n)]
Опять же, как уже упоминалось, np.empty(100)
уже даст вам полностью случайный массив размера. В чем проблема np.empty()
?
Вы можете использовать это лучше, чем ваш код
import random
xa = [None] * 100
xa[0] = random.random()
for i in xrange(1, 100):
xa[i] = xa[i-1] + random.random()