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 += 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]])

【讨论】:

以上是关于numpy 数组,a /= x 与 a = a / x 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Numpy - 将行添加到数组

数组:numpy.shape 与numpy.reshape函数

给定一个 numpy 数组视图中项目的索引,在基本数组中找到它的索引

分配给 NumPy 中的列

python数据分析——numpy数组学习

NumPy 错误:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()