2015-08-13 47 views
19

我使用python 2.7.3,当我执行下面的代码段:numpy的阵列,之间差的/ = X与A = A/X

import numpy as np 

a = np.array([[1,2,3],[4,5,6]]) 
a = a/float(2**16 - 1) 
print a 

这将导致在他下面的输出:

>> array([[1.52590219e-05, 3.05180438e-05, 4.57770657e-05], 
>>  [6.10360876e-05, 7.62951095e-05, 9.15541314e-05]]) 

究竟不如预期,但是当我执行下面的代码:

import numpy as np 

a = np.array([[1,2,3],[4,5,6]]) 
a /= float(2**16 - 1) 
print a 

我得到以下的输出:

>> array([[0, 0, 0], 
>>  [0, 0, 0]]) 

我预期的那样在前面的例子相同的输出,我不明白,不同的输出中,这似乎是使用a /= float(2**16 - 1) VS a = a/float(2**16 - 1)的结果。

+1

[我重新打开此。它与最初提出的重复有关,但该问题的答案都不涉及涉及的dtype问题。有可能是另一个重复的地方,但它不是那个。] – DSM

+0

@DSM同意,链接的问题真的不解释这里发生了什么。它解释了为什么有*可以*是一个不同的结果,但不是*为什么*在这种情况下发生。 – poke

+0

相关问题:[numpy self division的意外行为](http://stackoverflow.com/q/15907484/832621) –

回答

29

From the documentation:

警告:

代替操作将使用由所述两个操作数的数据类型所决定的精度执行计算,但将静默向下转换的结果(如果需要的话),以便它可以适应阵列。因此,对于混合精度计算,A {op}= B可能与A = A {op} B不同。例如,假设a = ones((3,3))。然后,a += 3ja = a + 3j不同:虽然它们都执行相同的计算,但a += 3会将结果转换回a,而a = a + 3j会将名称a重新绑定到结果。

由于您的数组是一个整数数组,因此在使用就地操作时,结果将被降级为整数。

如果你改变你的阵列,它存储了最初的花车,那么结果(这是浮动),可存储原始数组中,你的代码将正常工作:

>>> a = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) 
>>> a /= float(2**16 - 1) 
>>> a 
array([[ 1.52590219e-05, 3.05180438e-05, 4.57770657e-05], 
     [ 6.10360876e-05, 7.62951095e-05, 9.15541314e-05]])