Python 为什么numpy.convalve没有表现出联想性?

Python 为什么numpy.convalve没有表现出联想性?,python,numpy,Python,Numpy,我知道离散卷积应该是关联的。如果我有一些数组,x,那么x*(x*(x*x))应该等于(x*x)*(x*x)。但在某些情况下,这种情况不会发生 下面是使用四个示例来练习该公式的代码: [1,1]#有效 [-542982385998425]#有效 [-95.3720828588315,52.6296402253613]#工程 [-94.25133703348938,90.419992675677854]#破损 将numpy导入为np def main(): int_ok=np.array([1,1

我知道离散卷积应该是关联的。如果我有一些数组,x,那么x*(x*(x*x))应该等于(x*x)*(x*x)。但在某些情况下,这种情况不会发生

下面是使用四个示例来练习该公式的代码:

[1,1]#有效
[-542982385998425]#有效
[-95.3720828588315,52.6296402253613]#工程
[-94.25133703348938,90.419992675677854]#破损
将numpy导入为np
def main():
int_ok=np.array([1,1],dtype=np.int)
int_较大=np.array(
[-542982385998425],dtype=np.int
)
float_ok=np.array(
[-95.3720828588315,52.6296402253613],数据类型=np.float
)
float_break=np.array(
[-94.25133703348938,90.419992675677854],dtype=np.float
)
固定装置=[int_正常,int_较大,float_正常,float_损坏]
对于夹具中的夹具:
参考=np.convolve(
固定装置
卷积(
固定装置
卷积(
固定装置
固定装置
)
)
)
tmp=np.卷积(夹具,夹具)
测试=np.卷积(tmp,tmp)
打印('输入',夹具)
打印('参考输出',参考)
打印('输出',测试)
all_equal=all(参考==测试)
打印(“全部相等”,全部相等)
如果不是所有人都平等:
打印('错误',np.abs(参考-测试))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
我假设这是由于某种数值不稳定性造成的,但我不太清楚到底发生了什么

有人有什么想法吗

谢谢。

受Mark Dickinson这一评论的启发,我重新编写了我的原始代码,因此我不再假设结果完全相同,而是使用numpy.allclose

以下是修改后的代码:

将numpy导入为np
def main():
int_ok=np.array([1,1],dtype=np.int)
int_较大=np.array(
[-542982385998425],dtype=np.int
)
float_ok=np.array(
[-95.3720828588315,52.6296402253613],数据类型=np.float
)
float_break=np.array(
[-94.25133703348938,90.419992675677854],dtype=np.float
)
固定装置=[int_正常,int_较大,float_正常,float_损坏]
对于夹具中的夹具:
参考=np.convolve(
固定装置
卷积(
固定装置
卷积(
固定装置
固定装置
)
)
)
tmp=np.卷积(夹具,夹具)
测试=np.卷积(tmp,tmp)
如果np.ALLCOSE(参考、测试):
打印(“正常”,固定装置)
其他:
打印(“失败”,夹具)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

numpy.allclose
正在返回
True
,因此我认为这是我将得到的最佳解决方案。

即使是普通加法(或乘法)也与二进制浮点无关。我不认为有任何理由期望像卷积这样更复杂的东西是完全关联的。@MarkDickinson的可能重复这是一个关于浮点不关联的好观点,但我希望结果至少是接近的,即使不精确。这就是为什么我有第二张支票。我原以为差异很大,但在给numpy.allclose打电话询问结果后,结果还是真的。所以我猜他们在数字上没有明显的不同,他们不只是很接近;他们非常接近。至少在我的机器上,在您失败的情况下,
参考
测试
中出来,在五个条目中的三个条目中,最后一位(ulp)正好有一个单位,而在其他两个条目中正好相等。换句话说,所有条目的相对误差都大于2e-16。考虑到浮点的精度有限,在这里你真的不能再要求更好的了。卷积是关联的,所以你就不能使用
functools.reduce(np.convolve,*inputs)