Я просматриваю веб-курс вычислительной статистики, первый проект состоит из случайного блуждающего устройства, реализованная мною реализация работает по назначению:
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 ответ
Использовать 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()
Это действительно большое улучшение, но не совсем то же самое, что и исходный код, поскольку он не добавляет
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