Накопительное сложение в петле - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь суммировать добавление значения к предыдущему значению и каждый раз сохранять это значение в массиве.

Этот код является частью более крупного проекта.Для простоты я собираюсь определить мои переменные следующим образом:

ele_ini = [12]
smb = [2, 5, 7, 8, 9, 10]

val = ele_ini
for i in range(len(smb)):
     val += smb[i]
     print(val)
     elevation_smb.append(val)

Задача

Каждый раз, когда предыдущее значение, сохраненное в elevation_smb, заменяется текущимзначение, такое, что результат, который я получаю, равен:

elevation_smb = [22, 22, 22, 22, 22, 22]

Ожидаемый результат, однако, равен

elevation_smb = [14, 19, 26, 34, 43, 53]

NOTE : ele_ini - вектор с nэлементы.Я использую только 1 элемент только для простоты.

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Делай с reduce,

In [6]: reduce(lambda c, x: c + [c[-1] + x], smb, ele_ini)
Out[6]: [12, 14, 19, 26, 34, 43, 53]
0 голосов
/ 05 июня 2018

Кажется, вектор в вашем случае использует указатели.Вот почему это не создает новые ценности.Попробуйте добавить copy(), который копирует значение.

elevation_smb.append(val.copy())
0 голосов
/ 05 июня 2018

Не используйте петли, потому что медленно.Лучше быстрое векторизованное решение ниже.

Я думаю, нужно numpy.cumsum и добавить вектор ele_ini для 2d numpy array:

ele_ini = [12, 10, 1, 0]
smb = [2, 5, 7, 8, 9, 10]

elevation_smb  = np.cumsum(np.array(smb)) + np.array(ele_ini)[:, None]
print (elevation_smb)
[[14 19 26 34 43 53]
 [12 17 24 32 41 51]
 [ 3  8 15 23 32 42]
 [ 2  7 14 22 31 41]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...