Повышение эффективности случайного пешехода

Я просматриваю веб-курс вычислительной статистики, первый проект состоит из случайного блуждающего устройства, реализованная мною реализация работает по назначению:

import numpy as np
import numpy.random as rd
import matplotlib.pyplot as plt

WALKER_STEPS: int = 5_000

# random orientation converted from degrees to radians
directions: np.array = rd.uniform(low=0, high=360, size=WALKER_STEPS) * np.pi / 180

x: list = [0]
y: list = [0]
idx: int = 0
for rad in directions:
    # updates the positions of the walker
    x.append(x[idx] + np.cos(rad))
    y.append(y[idx] + np.sin(rad))
    idx += 1

plt.plot(x, y)
plt.show()

Мне не нравится, как я добавляю новые элементы в списки x, y и я думаю, что есть более элегантный способ сделать это.

Вот изображение результата:

Выполнение алгоритма случайного блуждания

Примечание: я не делал абстракции, потому что упражнение мало.

1 ответ
1

Использовать np.cumsum()

import numpy as np
import numpy.random as rd
import matplotlib.pyplot as plt
WALKER_STEPS: int = 5_000

# random orientation converted from degrees to radians
directions: np.array = rd.uniform(low=0, high=360, size=WALKER_STEPS) * np.pi / 180

x = np.cos(directions).cumsum()
y = np.sin(directions).cumsum()

plt.plot(x, y)
plt.show()

  • 1

    Это действительно большое улучшение, но не совсем то же самое, что и исходный код, поскольку он не добавляет 0 значение в начале массива. Вы могли бы просто сделать что-нибудь вроде x = np.empty(WALKER_STEPS+1); y = np.empty(WALKER_STEPS+1); x[0] = 0; y[0] = 0; x[1:] = np.cos(directions).cumsum(); y[1:] = np.sin(directions).cumsum() (извините за беспорядок), который точно воспроизводит исходный код, но сохраняет производительность вашего решения.

    – maxb


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *