仅在正面积的numpy数组中集成

ano*_*les 6 python arrays numpy numerical-integration

我希望能够使用numpys trapz函数计算跟随积分

numpy.trapz([-1, 1]) # returns 0
Run Code Online (Sandbox Code Playgroud)

但我不想允许负面区域.有没有一种有效的方法来做到这一点,还是我必须寻找最小点并手动转换数组?

是否numpy.trapz(numpy.abs([-1, 1]))有意义?

Dan*_*iel 3

如果你想放弃对集成领域的负面贡献,我们可以简单地获取np.trapz 源代码并重写它:

def abstrapz(y, x=None, dx=1.0):
    y = np.asanyarray(y)
    if x is None:
        d = dx
    else:
        x = np.asanyarray(x)
        d = np.diff(x)
    ret = (d * (y[1:] +y[:-1]) / 2.0)
    return ret[ret>0].sum()  #The important line
Run Code Online (Sandbox Code Playgroud)

快速测试:

np.trapz([-1,0,1])
0.0

abstrapz([-1,0,1])
0.5
Run Code Online (Sandbox Code Playgroud)

如果您只是想避免y小于零的区域,只需将小于零的“y”值屏蔽为零:

arr = np.array([-2,-1,0.5,1,2,1,0,5,3,0])
np.trapz(arr)
10.5

arr[arr<0] = 0
np.trapz(arr)
12.5
Run Code Online (Sandbox Code Playgroud)

这不是最好的方法,但它是一个很好的近似方法。如果这就是你的意思,我可以更新这个。

我不得不稍微改变你的例子,因为trapz([-1,1])根据定义总是返回 0 。我们确实以这种方式删除了一些功能,如果您需要在多维数组上执行此操作,很容易将其添加回来。