在 x 值处具有双重定义的 y 值的 numpy trapz 行为(冲突点)

numpy trapz behaviour with double defined y values at x values (conflicting points)

使用 numpy 的 trapz 函数时:在相同的 x 值上定义一个新的(不同的)y 值,结果不是我最初预期的结果。

>>> import numpy as np
>>> np.trapz([1,1,1],[0,1,2])           #normal area defined by 3 y values, y=1 at x=0,x=1 and x=2
2.0
>>> np.trapz([1,1,1,1,1],[0,1,2,1,2])   #redefine point x=1 and x=2 with the same y value that was already used
2.0
>>> np.trapz([1,1,1,2,2],[0,1,2,1,2])   #redefine point x=1 and x=2 but with y=2
2.5

我希望该点被完全覆盖(旧值被丢弃)或者最高点将被采用(丢弃所有重叠区域)。可以看出,事实并非如此。

这种行为背后是否有数学原因?还是这只是函数编程方式的结果(不应该像这样使用它)?

不幸的是,我的数学或编程知识还没有达到我可以根据 source code.

自己回答这个问题的水平

更多示例:

>>> np.trapz([1,1,1,2,2],[0,1,2,2,1])   #redefine point x=2 first and THEN x=1 with y=2
0.0
>>> np.trapz([1,2,2,1,1],[0,1,2,1,2])   #start with y=2 and then add y=1 on x=1 and x=2
3.0
>>> np.trapz([1,1,1],[0,1,2])           #normal area again
2.0
>>> np.trapz([1,1,1],[2,1,0])           #but now defined in reverse order
-2.0

(上下文:我有来自系统的数据,其中时间设置并不总是正确,有时时间戳再次从零开始计数,我想知道如果我不修复这些数据会发生什么,但是只需在 trapz 函数中输入即可)

当您在 trapz 中重复 x 值时,不会发生 "redefinition"。 trapz 方法执行以下操作:

  1. 计算连续 x 值的差值。例如,x=[0,1,2,1,2] 产生 [1, 1, -1, 1].
  2. 计算连续 y 值的平均值。例如,y=[1,2,2,1,1] 产生 [1.5, 2, 1.5, 1]
  3. 将结果中的匹配条目相乘,然后添加这些产品。即1*1.5 + 1*2 + (-1)*1.5 + 1*1 = 3

算法不关注某些x值是否出现两次; none 的 y 值替换了其他值。

有时用不同的 y 值连续两次输入相同的 x 值是有用的:即 .

乱序输入 x 值也可能很有用。每次回溯时,相应的 y 值都会对积分产生负面影响。例如,如果 (x,y) 对是下面绘制的多边形的顶点,按顺时针顺序给出,则 trapz 的输出是阴影区域。从右到左遍历的线段切掉了它们下方的区域,而不是添加。

再比如,如果x是位置,y是物体在那个位置时所施加的力,积分就是所做的总功;在这种情况下,如果对象左右移动,则 x 乱序是有意义的。

但是,如果您的数据点 碰巧 由于某些与数据含义无关的随机原因而出现故障,那么 trapz 的输出将毫无意义.