Python 2.7 Python2.7和Numpy的不同版本对同一脚本产生不同的结果
我有以下脚本:Python 2.7 Python2.7和Numpy的不同版本对同一脚本产生不同的结果,python-2.7,debugging,numpy,Python 2.7,Debugging,Numpy,我有以下脚本: import numpy as np pin_info = {} pinID = 4 pin_info[pinID] = {} pin_info[pinID]['matvols'] = np.array([0.4096,0.418,0.475,1.26])**2 pin_info[pinID]['matvols'][:-1] *= np.pi pin_info[pinID]['matvols'][1:] -= pin_info[pinID]['matvols'][:-1]
import numpy as np
pin_info = {}
pinID = 4
pin_info[pinID] = {}
pin_info[pinID]['matvols'] = np.array([0.4096,0.418,0.475,1.26])**2
pin_info[pinID]['matvols'][:-1] *= np.pi
pin_info[pinID]['matvols'][1:] -= pin_info[pinID]['matvols'][:-1]
print(pin_info)
我的工作机器使用Python 2.7.3和Numpy 1.6.1,并给出以下结果:
{4: {'matvols': array([ 0.52707179, 0.02183985, 0.68698199, 0.90061801])}
{4: {'matvols': array([ 0.52707179, 0.02183985, 0.68698199, 0.87877816])}}
我的本地计算机使用Python 2.7.11和Numpy 1.10.4,并给出以下结果:
{4: {'matvols': array([ 0.52707179, 0.02183985, 0.68698199, 0.90061801])}
{4: {'matvols': array([ 0.52707179, 0.02183985, 0.68698199, 0.87877816])}}
除非我的数学做得不对,否则本地机器产生的结果应该是正确的答案。(工作机器最后一次输入的pin_info[4]['matvols']错误。)但是,我不知道为什么我的工作机器产生了错误的答案。有人有什么想法吗?我在两台机器上运行了完全相同的脚本。我甚至对这些文件进行了md5sum处理,以确保它们完全相同
编辑:如果您有一个接近2.7.3/1.6.1的Python/Numpy版本,如果您可以尝试此脚本并查看您得到的答案,那就太好了。~0.87877816确实是正确的结果:
- 使用(来自)
):
calc'1.26^2-0.475^2*pi()
-=
操作之前,一切正常:
In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:import numpy as np
:
:pin_info = {}
:
:pinID = 4
:pin_info[pinID] = {}
:pin_info[pinID]['matIDs'] = [1,4,5,6]
:pin_info[pinID]['matvols'] = np.array([0.4096,0.418,0.475,1.26])**2
:pin_info[pinID]['matvols'][:-1] *= np.pi
:--
In [2]: pin_info[pinID]['matvols']
Out[2]: array([ 0.52707179, 0.54891163, 0.70882184, 1.5876 ])
切片也起作用:
In [3]: pin_info[pinID]['matvols'][1:]
Out[3]: array([ 0.54891163, 0.70882184, 1.5876 ])
In [4]: pin_info[pinID]['matvols'][:-1]
Out[4]: array([ 0.52707179, 0.54891163, 0.70882184])
事实上,我们可以从这里计算出正确的结果:
In [5]: pin_info[pinID]['matvols'][1:] - pin_info[pinID]['matvols'][:-1]
Out[5]: array([ 0.02183985, 0.15991021, 0.87877816])
但是-=
似乎没有做正确的事情:
In [7]: pin_info[pinID]['matvols'][1:] -= pin_info[pinID]['matvols'][:-1]
In [8]: pin_info
Out[8]:
{4: {'matIDs': [1, 4, 5, 6],
'matvols': array([ 0.52707179, 0.02183985, 0.68698199, 0.90061801])}}
(使用Python 3.2.3和NumPy 1.6.1以及Python 2.7.3和(以及)NumPy 1.6.1复制。)
这是怎么回事?让我们看一个整数示例:
In [1]: import numpy as np
In [2]: x = np.array([5, 23, 42, 1000])
In [3]: x[1:] - x[:-1]
Out[3]: array([ 18, 19, 958])
In [4]: x[1:] -= x[:-1]
In [5]: x
Out[5]: array([ 5, 18, 24, 976])
你能看到图案吗?它从左到右处理组件,并使用已修改的值计算后续组件。我们可以在不使用NumPy的情况下模拟这一点:
In [1]: x = [5, 23, 42, 1000]
In [2]: for i in range(len(x) - 1):
...: x[i + 1] -= x[i]
...:
In [3]: x
Out[3]: [5, 18, 24, 976]
我想这是/是NumPy 1.6中的一个bug,在后来的版本中得到了修复。啊,好的,我明白了。所以我猜结论是Numpy中有一个带-=操作符的bug?我在我的工作机器上做了一些类似的调试分析,得出了与您相同的结论。谢谢你花时间看了一遍。