2016-03-03 48 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

相關問題