Python генерирует массив диапазонов со случайным размером шага - PullRequest
0 голосов
/ 13 ноября 2018

Цели: Инициализировать массив с заданным размером со случайным числом. Я пробовал этот способ и работает:

xa = np.empty(100)
xa[0] = random.random()
for i in range(1,100):
    xa[i] = xa[i-1] + random.random()

Мой вопрос: есть ли лучший способ сделать это? может быть без цикла for?

Ответы [ 5 ]

0 голосов
/ 13 ноября 2018

Учитывая, что вы используете 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]

Но если то, что вы хотите, если что-то, что возвращает диапазон (например, из функции range ), но со случайным шагом вы можете сделать что-то вроде этого:

xa = np.cumsum(np.random.randint(100, size=(100,)))
print(xa[:5])

выход

[ 62 157 208 303 306]

Обратите внимание, что в обоих случаях печатаются только первые 5 цифр. Также в обоих случаях шаг положительный.

Далее

  1. Документация по cumsum , randint и random .
0 голосов
/ 13 ноября 2018

Использовать понимание списка:

import random
n = 100   # your array size
xa = [random.random() for _ in range(n)]

Опять же, как уже упоминалось, np.empty(100) уже даст вам полностью случайный массив размера.В чем проблема с np.empty()?

0 голосов
/ 13 ноября 2018

Вы также можете использовать 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(), как вы написали в своем вопросе.

0 голосов
/ 13 ноября 2018

Простой однострочный

import random 
xa = random.sample(range(1, 101), 100)
0 голосов
/ 13 ноября 2018

Вы можете использовать это лучше, чем ваш код

import random
xa = [None] * 100
xa[0] = random.random()
for i in xrange(1, 100):
        xa[i] = xa[i-1] + random.random()
...