我希望能够使用 numpys trapz 函数计算以下积分
numpy.trapz([-1, 1]) # returns 0
但我不想允许负面区域。有没有一种有效的方法可以做到这一点,还是我必须寻找最小点并手动转换数组?
numpy.trapz(numpy.abs([-1, 1]))
有意义吗?
我希望能够使用 numpys trapz 函数计算以下积分
numpy.trapz([-1, 1]) # returns 0
但我不想允许负面区域。有没有一种有效的方法可以做到这一点,还是我必须寻找最小点并手动转换数组?
numpy.trapz(numpy.abs([-1, 1]))
有意义吗?
如果您想丢弃对集成区域的负面贡献,我们可以简单地获取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
快速测试:
np.trapz([-1,0,1])
0.0
abstrapz([-1,0,1])
0.5
如果您只想避免小于零的区域,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
这不是最好的方法,但它是一个很好的近似值。如果这是你的意思,我可以更新这个。
我不得不稍微改变你的例子,因为trapz([-1,1])
根据定义总是会返回 0 。我们确实通过这种方式删除了一些功能,如果您需要在多维数组上执行此操作,很容易将其添加回来。