python 如何使numpy.cumsum在第一个值之后开始

vptzau2j  于 2023-03-21  发布在  Python
关注(0)|答案(5)|浏览(130)

我有:

import numpy as np

position = np.array([4, 4.34, 4.69, 5.02, 5.3, 5.7, ..., 4])
x = (B/position**2)*dt

A = np.cumsum(x)
assert A[0] == 0  # I want this to be true.

其中Bdt是标量常数。这是一个初始条件为A[0] = 0的数值积分问题。有没有一种方法可以设置A[0] = 0,然后对其他所有内容执行cumsum

relj7zay

relj7zay1#

我不明白你的问题到底是什么,但是这里有一些你可以做的事情。
你可以创建一个长一个索引的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)

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

xkrw2x1b

xkrw2x1b2#

1D累积

np.cumsum的 Package 器,将第一个元素设置为0

def cumsum(pmf):
    cdf = np.empty(len(pmf) + 1, dtype=pmf.dtype)
    cdf[0] = 0
    np.cumsum(pmf, out=cdf[1:])
    return cdf

示例用法:

>>> np.arange(1, 11)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

>>> cumsum(np.arange(1, 11))
array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45, 55])

N-D累积

一个围绕np.cumsum的 Package 器,它将第一个元素设置为0,并使用N-D数组:

def cumsum(pmf, axis=None, dtype=None):
    if axis is None:
        pmf = pmf.reshape(-1)
        axis = 0

    if dtype is None:
        dtype = pmf.dtype

    idx = [slice(None)] * pmf.ndim

    # Create array with extra element along cumsummed axis.
    shape = list(pmf.shape)
    shape[axis] += 1
    cdf = np.empty(shape, dtype)

    # Set first element to 0.
    idx[axis] = 0
    cdf[tuple(idx)] = 0

    # Perform cumsum on remaining elements.
    idx[axis] = slice(1, None)
    np.cumsum(pmf, axis=axis, dtype=dtype, out=cdf[tuple(idx)])

    return cdf

示例用法:

>>> np.arange(1, 11).reshape(2, 5)
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])

>>> cumsum(np.arange(1, 11).reshape(2, 5), axis=-1)
array([[ 0,  1,  3,  6, 10, 15],
       [ 0,  6, 13, 21, 30, 40]])
qc6wkl3g

qc6wkl3g3#

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

np.cumsum(np.pad(array, (1, 0), "constant"))

这里的array(B/position**2)*dt。你也可以改变np.padnp.cumsum的顺序。我只是在数组的开头加上一个零,然后调用np.cumsum

p1tboqfb

p1tboqfb4#

可以使用roll(右移1),然后将第一个条目设置为零。

vuktfyat

vuktfyat5#

另一种方法是简单地将0添加到您正在执行cumsum的列表中:

import numpy as np

position = np.array([4, 4.34, 4.69, 5.02, 5.3, 5.7, ..., 4])
x = (B/position**2)*dt

A = np.cumsum([0] + x)

如果xlistnp.ndarray,则这两种情况都有效。

相关问题