Если у меня есть z = cumsum( [ 0, 1, 2, 6, 9 ] )
, который дает мне z = [ 0, 1, 3, 9, 18 ]
, как я могу вернуться к исходному массиву [ 0, 1, 2, 6, 9 ]
?
Что такое обратная функция numums cumsum?
Ответ 1
z[1:] -= z[:-1].copy()
Короткий и сладкий, без медленных петель Python. Мы рассматриваем все, кроме первого элемента (z[1:]
), и все, кроме последнего (z[:-1]
), и вычитаем элементно. Копия гарантирует, что мы вычтем исходные значения элементов вместо значений, которые мы вычисляем. (В NumPy 1.13 и выше вы можете пропустить вызов copy
.)
Ответ 2
Вы можете использовать np.diff
для вычисления элементов 1...N
, которые будут иметь значение между любыми двумя элементами. Это противоположно cumsum
. Единственное отличие состоит в том, что diff
не вернет первый элемент, но первый элемент будет таким же в исходном и cumsum
выводах, поэтому мы просто повторно используем это значение.
orig = np.insert(np.diff(z), 0, z[0])
Вместо insert
вы также можете использовать np.concatenate
orig = np.concatenate((np.array(z[0]).reshape(1,), np.diff(z)))
Мы могли бы просто скопировать и заменить элементы 1...N
orig = z.copy()
orig[1:] = np.diff(z)
Ответ 3
Мой любимый:
orig = np.r_[z[0], np.diff(z)]
Ответ 4
Если вы хотите сохранить z
, вы можете использовать np.ediff1d
:
x = np.ediff1d(z, to_begin=z[0])