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