我有一个创建列表的公式:
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?
答案 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)*dt
是np.pad
。您也可以更改np.cumsum
和np.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");
})
});
。