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)