numpy数组,a/= x与a = a/x之间的差异

Gio*_*Gio 20 python arrays numpy in-place integer-division

我正在使用python 2.7.3,当我执行以下代码时:

import numpy as np

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

这将导致他跟随输出:

>> array([[1.52590219e-05, 3.05180438e-05, 4.57770657e-05],
>>       [6.10360876e-05, 7.62951095e-05, 9.15541314e-05]])
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,但是当我执行以下代码时:

import numpy as np

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

我得到以下输出:

>> array([[0, 0, 0],
>>        [0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

我期望与前面的例子相同的输出,我不明白不同的输出,这似乎是使用a /= float(2**16 - 1)vs 的结果a = a / float(2**16 - 1).

pok*_*oke 32

从文档:

警告:

就地操作将使用由两个操作数的数据类型决定的精度来执行计算,但是将静默地向下转换结果(如果需要),以便它可以适合回到数组中.因此,对于混合精度计算,A {op}= B可以不同A = A {op} B.例如,假设a = ones((3,3)).那么,a += 3j是不是不同a = 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]])
Run Code Online (Sandbox Code Playgroud)