Python numpy数据类型转换在x=x+;a和x+=A.
在python中操作一些numpy数组时,我注意到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之间是完全等价的,我一
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就地操作的缺点是避免了分配新阵列,因此效率更高。请参阅