关于Numpy中+=与-=操作符不支持数组广播的特性

Posted Prince.CCC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Numpy中+=与-=操作符不支持数组广播的特性相关的知识,希望对你有一定的参考价值。

1.什么是数组广播:

首先介绍Numpy中广播的特性,如以下代码:

x = np.array([[133, 160],
              [160, 172],
              [152, 70],
              [120, 60]])
y = np.array([[1, 0]])
y = y + x

在上述代码中x时4*2的矩阵,y是1*2的矩阵。

在数学上x和y是不能想加的,但是在Numpy中,为了计算方便,加入了广播特性,即将此处y向下扩充为与x行列数相等,等同于以下代码:

x = np.array([[133, 160],
              [160, 172],
              [152, 70],
              [120, 60]])
y = np.array([[1, 0],
              [1, 0],
              [1, 0],
              [1, 0]])
y = y + x

上面俩代码计算结果相同,打印为:

[[134 160]
[161 172]
[153 70]
[121 60]]

这就是广播特性,在对大样本线性运算(wx+b),对所有样本加相同的b值时,效果显著。

2.+=不支持广播特性

今天上午手撸神经网络的时候,在计算梯度下降时有这么一串代码

self.w -= self.d_w * alpha
self.b -= self.d_b * alpha
self.x -= self.d_x * alpha
self.z -= self.d_z * alpha
self.a -= self.d_a * alpha

其中x, b, w, z, a与d_w, d_b, d_x, d_a, d_z都是numpy类型矩阵

b的维度是1*2,d_b的维度是4*2。

按照前文描述,这里应该可以算出一个4*2的矩阵,但结果报错了!

self.b -= self.d_b * alpha
ValueError: non-broadcastable output operand with shape (1,2) doesn't match the broadcast shape (4,2)

意思为在第二行中,两个矩阵行列数不匹配,不能进行广播运算,这不奇怪了吗?

翻阅CSDN无果,就瞎倒腾。最终发现,将-=改为普通的赋值操作即可完成任务...

是不是说,numpy不支持-=的广播操作呢?

马上实验!

  • 使用赋值操作符

    x = np.array([[133, 160],
                  [160, 172],
                  [152, 70],
                  [120, 60]])
    y = np.array([[1, 0]])
    y = y + x  # 不报错
    print(y)

正常打印:

[[134 160]
[161 172]
[153 70]
[121 60]]
  • 使用自加操作符:

    x = np.array([[133, 160],
                  [160, 172],
                  [152, 70],
                  [120, 60]])
    y = np.array([[1, 0]])
    y += x  # 报错
    print(y)
ValueError: non-broadcastable output operand with shape (1,2) doesn't match the broadcast shape (4,2)

果然!

所以说,大家以后能不用自加还是不要用吧...不少几个字

第一次创作,厚脸皮问大家讨赞了...🙇

以上是关于关于Numpy中+=与-=操作符不支持数组广播的特性的主要内容,如果未能解决你的问题,请参考以下文章

numpy中的广播机制

关于Numpy 的一些操作

初探numpy——广播和数组操作函数

numpy:数组的运算与广播机制

Numpy的广播机制详解(broadcasting)

是否可以在 Numpy 矢量化广播操作期间访问当前索引?