关于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)

果然!

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

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

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值