〜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中的錯誤已修復在某些更高版本。
好的,我明白了。所以我猜測結論是Numpy中有一個使用 - =操作符的錯誤?我在我的工作機器上做了一些類似的調試分析,而且我的結論和你一樣。感謝您花時間去完成它。 – nukeguy