在 python 中操作一些 numpy 数组时,我注意到 x=x+a
和 x+=a
之间的操作存在一些差异。
我想做的是简单地向整数列表添加一些随机错误,如下所示:
x=numpy.arange(12)
a=numpy.random.random(size=12)
x+=a
但是打印出 x
给出一个整数列表 [0,1,2,3,4,5,6,7,8,9,10,11]
.
事实证明,如果我改用 x=x+a
,它会按预期工作。
这是我们应该注意的事情吗,我的意思是它的行为如此不同。我曾经认为 x+=a
和 x=x+a
是完全等价的,我一直在交替使用它们而没有一直注意。现在,我对到目前为止所做的所有计算感到非常担心和焦虑。谁知道这在何时何地造成了问题,我必须仔细检查所有内容。
这是 numpy 中的错误吗?我在 numpy 版本 1.2.0 和 1.6.1 中进行了测试,他们都这样做了。
最佳答案
不,这不是错误,这是预期的行为。 +=
进行就地加法,因此它不能更改数组 x
的数据类型。当 dtype 是整数时,这意味着添加 a
的元素所产生的浮点临时值将被截断为整数。由于 np.random.random
返回 [0, 1)
范围内的 float ,结果总是被截断为 x
中的值。
相比之下,x + a
无论如何都需要分配一个新数组,并且当一个参数是 float 而另一个是整数时,将新数组的 dtype 向上转换为 float。
避免此问题的最佳方法是在 arange
调用中明确说明所需的数据类型:
x = np.arange(12, dtype=float)
x += np.random.random(size=12)
(请注意,x += a
和 x = x + a
在 Python 中很少等价,因为后者通常会修改 x 指向的对象
. 例如,使用纯 Python 列表:
a = []
b = a
a += [1]
也修改 b
,而 a = a + [1]
将保持 b
不变。)
关于python - numpy 数据类型转换在 x=x+a 和 x+=a 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23407736/