Векторизация для цикла с взаимодействующими элементами - PullRequest
1 голос
/ 23 декабря 2019

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

, которое я теперь могу применить к реальному делу.

1 Ответ

1 голос
/ 23 декабря 2019

Вы можете сделать это, используя 1 вызов на np.cumsum и 1 вызов на np.exp:

sumint = np.sum(np.cumsum(np.exp(x2)))

Если вам также нужны значения f1 или f2:

f1 = f2 = sum(np.exp(x2))

Это дает те же значения, что и ваш код, но векторизовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...