NumPy标量,广播和__iadd__方法

时间:2013-11-21 23:04:41

标签: python numpy

关于这种奇怪的想法?

from numpy import *

a = array([1,2])
b = 1
b += a
正如您所料,

给出array([2,3])。但是

a = array([1,2])
b = array(1)
b += a

给出错误“shape()的不可广播输出操作数与广播形状(2)不匹配”。同时

a = array([1,2])
b = array(1)
b = b + a

给出array([2,3])。这种行为是否像第一眼看上去一样奇怪?

提前致谢。

1 个答案:

答案 0 :(得分:3)

+=运算符用于表示“就地求和”。 Numpy对就地的含义施加了一些约束:它不能改变数组的大小或类型。执行b = b + a时没有问题,因为b现在指向添加ba所产生的新对象,这是一个长度为2的数组。 b += a失败并不奇怪,因为长度为2的数组无法适应长度为1的数组。

至于你的第一个测试用例,我的猜测是因为Python int是immutable个对象,每当你__iadd__到一个对象时,你就是在有效地创建一个新对象并指向它,而不是修改它你拥有的对象,所以没有理由不应该使用数组。