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

时间:2014-12-02 20:50:39

标签: python numpy numerical-methods

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

import numpy as np
A = np.cumsum((B/position**2)*dt)
A[0] = 0

其中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?

2 个答案:

答案 0 :(得分: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)

结果:

A = [ 0.          0.0625      0.11559096  0.16105356  0.20073547  0.23633533

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]

结果:

[ 0.          0.05309096  0.09855356  0.13823547  0.17383533  0.20461403]
len(A) == len(position)

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

答案 1 :(得分:0)

我完全理解您的痛苦,我想知道为什么Numpy不允许np.cumsum(np.pad(array, (1, 0), "constant")) 使用它。无论如何,尽管我真的很晚并且已经有了另一个不错的答案,但我还是更喜欢这个答案:

array

在您的情况下,(B/position**2)*dtnp.pad。您也可以更改np.cumsumnp.cumsum的顺序。我只是在数组的开头添加一个零,然后调用var givePointsSheduler = schedule.scheduleJob(convertedDate, function() { User.findOneAndUpdate( { _id: userId }, { '$inc': { balance: nrOfPoints } }).exec() .then(result => { console.log("Added points succesfully"); console.log(new Date().toISOString()); }) .catch(err => { console.log("error adding points"); }) });