【问题标题】:NumPy scalars, broadcasting and the __iadd__ methodNumPy 标量、广播和 __iadd__ 方法
【发布时间】:2013-11-22 16:17:32
【问题描述】:

对这个奇怪的东西有什么想法吗?

from numpy import *

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

如您所料,提供array([2,3])。但是

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

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

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

给出array([2,3])。这种行为是否像乍看起来一样奇怪?

提前致谢。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

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

    至于您的第一个测试用例,我的猜测是,由于 Python 整数是 immutable 对象,每当您将 __iadd__ 设置为一个时,您实际上是在创建一个新对象并指向它,而不是修改您拥有的对象,所以没有理由不使用数组。

    【讨论】:

      猜你喜欢
      • 2014-04-06
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      相关资源
      最近更新 更多