numpy 数组,a /= x 与 a = a / x 之间的区别
Posted
技术标签:
【中文标题】numpy 数组,a /= x 与 a = a / x 之间的区别【英文标题】:numpy array, difference between a /= x vs. a = a / x 【发布时间】:2015-08-13 12:03:48 【问题描述】:当我执行以下代码时,我使用的是 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
这将导致以下输出:
>> 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)
与 a = a / float(2**16 - 1)
的结果。
【问题讨论】:
[我重新打开这个。它与最初提议的副本有关,但该问题的答案都没有解决所涉及的 dtype 问题。某处可能还有另一个重复项,但不是那个。] @DSM 同意,链接的问题实际上并没有解释这里发生了什么。它解释了为什么可能会出现不同的结果,而不是为什么会在这种情况下发生。 相关问题:Unexpected behavior for numpy self division 【参考方案1】:From the documentation:
警告:
就地操作将使用由两个操作数的数据类型决定的精度来执行计算,但会默默地向下转换结果(如有必要),以便它可以放回数组中。因此,对于混合精度计算,
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]])
【讨论】:
以上是关于numpy 数组,a /= x 与 a = a / x 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
数组:numpy.shape 与numpy.reshape函数