如何在第一个值[Python]之后启动numpy.cumsum

Gla*_*rse 3 python numpy numerical-methods

我有一个创建列表的等式:

import numpy as np
A = np.cumsum((B/position**2)*dt)
A[0] = 0
Run Code Online (Sandbox Code Playgroud)

其中B是常数,并且位置是列表:[4,4.34,4.69,5.02,5.3,5.7,...,4] dt也是常数.我这样做是为了进行数值积分.A [0] = 0是问题的初始条件,但这不会反映在等式中.如果我在np.cumsum之后有A [0],那么A [1]将使用方程中最初记录的A [0].有没有办法让方程式使用给定的A [0],然后在A [0]之后为所有事物做一个cumsum?

jka*_*den 6

我不明白你的问题究竟是什么,但这里有一些你可以做的事情A[0] = 0.

您可以将A创建为一个索引更长,以将零作为第一个条目:

# initialize example data
import numpy as np
B = 1
dt = 1
position =  np.array([4, 4.34, 4.69, 5.02, 5.3, 5.7])

# do calculation
A = np.zeros(len(position) + 1)
A[1:] = np.cumsum((B/position**2)*dt)
Run Code Online (Sandbox Code Playgroud)

结果:

A = [ 0.          0.0625      0.11559096  0.16105356  0.20073547  0.23633533
Run Code Online (Sandbox Code Playgroud)

0.26711403] len(A)== len(position)+ 1

或者,您可以操作计算以减去结果的第一个条目:

# initialize example data
import numpy as np
B = 1
dt = 1
position =  np.array([4, 4.34, 4.69, 5.02, 5.3, 5.7])

# do calculation
A = np.cumsum((B/position**2)*dt)
A = A - A[0]
Run Code Online (Sandbox Code Playgroud)

结果:

[ 0.          0.05309096  0.09855356  0.13823547  0.17383533  0.20461403]
len(A) == len(position)
Run Code Online (Sandbox Code Playgroud)

如您所见,结果有不同的长度.其中一个是你所期望的吗?


Far*_*ini 5

我完全理解你的痛苦,我想知道为什么 Numpy 不允许这样做np.cumsum。不管怎样,虽然我真的迟到了,而且已经有了另一个很好的答案,但我更喜欢这个:

np.cumsum(np.pad(array, (1, 0), "constant"))
Run Code Online (Sandbox Code Playgroud)

array你的情况是在哪里(B/position**2)*dt。您也可以更改np.pad和的顺序。np.cumsum我只是在数组的开头添加一个零并调用np.cumsum.