〜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