2016-03-03 68 views
1

我有以下脚本:不同版本的Python 2.7和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] 
print(pin_info) 

我的工作机器使用Python 2.7.3和1.6.1 numpy的,并给出以下结果:

{4: {'matvols': array([ 0.52707179, 0.02183985, 0.68698199, 0.90061801])} 

我的本地机器上使用Python 2.7.11和numpy的1.10.4,并给出了以下结果:

{4: {'matvols': array([ 0.52707179, 0.02183985, 0.68698199, 0.87877816])}} 

除非我错误地算了我的数学,否则我的本地机器产生的结果应该是正确的答案。 (工作机器得到pin_info [4] ['matvols']的最后一项错误。)但是,我不知道为什么我的工作机器产生了错误的答案。有人有任何想法吗?我在两台机器上运行完全相同的脚本。我甚至把这些文件都保存在一起,以确保它们完全一样。

编辑:如果你有一个Python版本/ numpy的的亲密关系的2.7.3/1.6.1,这将是巨大的,如果你可以试试这个脚本,看看哪个回答你。

回答

1

〜0.87877816确实是正确的结果:

  • 使用calc(从 Ubuntu package apcalc):

    calc '1.26^2 - 0.475^2 * pi()' 
    

      ~0.87877815753380290057
  • 使用NumPy的:

    In [6]: np.dot(np.array([0.475, 1.26]) ** 2 * np.array([np.pi, 1]), np.array([-1, 1])) 
    Out[6]: 0.87877815753380306 
    

直到刚刚-=操作之前,一切都按预期工作:

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中的错误已修复在某些更高版本。

+0

好的,我明白了。所以我猜测结论是Numpy中有一个使用 - =操作符的错误?我在我的工作机器上做了一些类似的调试分析,而且我的结论和你一样。感谢您花时间去完成它。 – nukeguy

相关问题