在 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 方法执行以下操作:
- 计算连续 x 值的差值。例如,
x=[0,1,2,1,2]
产生 [1, 1, -1, 1]
.
- 计算连续 y 值的平均值。例如,
y=[1,2,2,1,1]
产生 [1.5, 2, 1.5, 1]
- 将结果中的匹配条目相乘,然后添加这些产品。即
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 的输出将毫无意义.
使用 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 方法执行以下操作:
- 计算连续 x 值的差值。例如,
x=[0,1,2,1,2]
产生[1, 1, -1, 1]
. - 计算连续 y 值的平均值。例如,
y=[1,2,2,1,1]
产生[1.5, 2, 1.5, 1]
- 将结果中的匹配条目相乘,然后添加这些产品。即
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 的输出将毫无意义.