Python NumPy标量、广播和_uiadd_uu_u_u_u_u_u_u_u_u_u_u___________

Python NumPy标量、广播和_uiadd_uu_u_u_u_u_u_u_u_u_u_u___________,python,numpy,Python,Numpy,对这个怪事有什么看法吗 from numpy import * a = array([1,2]) b = 1 b += a 如您所料,给出数组([2,3])。但是 a = array([1,2]) b = array(1) b += a 给出错误“具有形状()的不可广播输出操作数与广播形状(2)不匹配”。同时 a = array([1,2]) b = array(1) b = b + a 给出数组([2,3])。这种行为和乍一看一样奇怪吗 提前感谢。将+=运算符理解为“就地求和”。Num

对这个怪事有什么看法吗

from numpy import *

a = array([1,2])
b = 1
b += a
如您所料,给出
数组([2,3])
。但是

a = array([1,2])
b = array(1)
b += a
给出错误“具有形状()的不可广播输出操作数与广播形状(2)不匹配”。同时

a = array([1,2])
b = array(1)
b = b + a
给出
数组([2,3])
。这种行为和乍一看一样奇怪吗


提前感谢。

+=
运算符理解为“就地求和”。Numpy对在位的含义施加了一些约束:它不能更改数组的大小或数据类型。当您执行
b=b+a
时,没有问题,因为
b
现在指向一个新对象,该对象是通过添加
b
a
得到的,这是一个长度为2的数组。
b+=a
失败并不奇怪,因为长度2数组无法装入长度1数组

至于您的第一个测试用例,我的猜测是,由于Python int是对象,所以每当您
\uu iadd\uuu
到一个对象时,您实际上是在创建一个新对象并指向它,而不是修改您拥有的对象,因此没有理由不使用数组