Python numpy数据类型转换在x=x+;a和x+=A.

Python numpy数据类型转换在x=x+;a和x+=A.,python,numpy,casting,Python,Numpy,Casting,在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之间是完全等价的,我一

在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中的一个bug吗?我已经在numpy版本1.2.0和1.6.1中进行了测试,他们都这样做了。

x+=a
修改
x
到位:数据将在分配时转换为
int
x=x+a
x+a
的结果分配给标签
x
,在这种情况下
x+a
将升级为
float

不,这不是错误,这是预期行为
+=
执行就地加法,因此无法更改数组
x
的数据类型。当数据类型为整数时,这意味着由于添加
a
的元素而产生的浮点临时变量将被截断为整数。由于
np.random.random
返回范围
[0,1)
内的浮点值,因此结果总是被截断回
x
中的值

相比之下,
x+a
无论如何都需要分配一个新数组,并且当一个参数是float,另一个是整数时,将该新数组的数据类型向上转换为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
不变。)

非常感谢。上帝啊,我从脚本中简单地将
+=
变灰就得到了这么多行。噩梦。感谢你澄清这一点。所以对于标量变量,它们是相同的,而差异只是针对参考变量?我想知道保留此功能有什么好处。或者我是唯一不知道这一点的人……adv就地操作的缺点是避免了分配新阵列,因此效率更高。请参阅