Я учусь векторизовать свой код, который в настоящее время страдает от серьезных временных проблем. Моя цель - избавиться от всех петель, которые замедляют процесс. Это работало нормально, когда мне не нужно было знать результат шага i для вычисления шага i + 1.
В какой-то момент это больше не имеет места. Я попытался разбить задачу на этот упрощенный фрагмент:
x2 = np.arange(10)
f1, sumint = 0.0, 0.0
for i in x2:
f2 = np.exp(x2[i]) + f1
sumint += f2
f1 = f2
Термин np.exp(x2[i])
, конечно, можно рассчитать для всей матрицы. Но f1 - это термин, который несет в себе результат i-1, который я заранее не знаю (или не знаю?)
Я ищу решение этой проблемы, потому что реальный код включает в себяболее сложные вычисления и больше переменных, таких как f1. Мне известно о numpy.vectorize
, но в документах говорится, что это не ускоряет код, а скорее способствует удобочитаемости.
Редактировать: Возможно, этот пример больше подходит для показа моего реального случая ...
x2 = np.random.rand(10)
y2 = np.random.rand(10)
f2 = np.random.rand(10)
sumint, f1, x1, y1 = 0, 0, 0, 0
for i in range(10):
sumint += (f2[i] - f1) * (x2[i] - x1) / (y2[i] - y1)
x1 = x2[i]
y1 = y2[i]
f1 = f2[i]
Редактировать 2: Извините за это, я нашел решение. Разобрав проблему до сути, я обнаружил, что то, что я думал о рекурсии, было просто СДВИГОМ. Решение проблемы было:
f1 = np.zeros(10)
x1 = np.zeros(10)
y1 = np.zeros(10)
x1[1:] = x2[:-1]
y1[1:] = y2[:-1]
f1[1:] = f2[:-1]
sumint = (f2 - f1) * (x2 - x1) / (y2 - y1)
, которое я теперь могу применить к реальному делу.