11月12日numpy学习总结——numpy的广播规则
在numpy中,两个shape不完全相同的数组可以做运算。比如:
aa = array([[0, 1, 2],
[3, 4, 5]])
bb = array([0, 1, 2])
aa+bb的值为:array([[0, 2, 4],
[3, 5, 7]])
这是因为numpy存在广播机制
在numpy中,广播遵循以下3条规则:
1、升维。如果两个数组的维度数不同,则小维度数的数组在左边加1维。
2、扩展。如果两个数组维度数相同,但是在对应的维度上都不匹配,则在维度为1的方向上扩展直到和另一个数组匹配。
3、异常。如果两个数组没有为1的维度,且对应的维度不匹配,则引发异常。
以下通过例子来解释以上规则。
例子1:
aa = array([[0, 1, 2],
[3, 4, 5]])
bb = array([0, 1, 2])
求:aa+bb
aa.shape 为(2,3)
bb.shape 为(3,)
首先,由于bb的维度数较小,因此bb的维度会升维为(1,3),注意是在左边加1,不是在右边加1,即bb的shape变为(1,3),而非(3,1)
然后,由于bb升维后,在第1个维度上和aa不匹配,因此,bb在第一个维度上进行扩展,直到和aa的维度相同,bb会变为array([[0,1,2],
[0,1,2]])
最后,aa+bb,就是对应位置的元素相加,结果为:
array([[0, 2, 4],
[3, 5, 7]])
例子2:
aa = np.arange(3)
bb = np.arange(3).reshape(3,1)
求:aa+bb
aa.shape为(3,)
bb.shape为(3,1)
**首先,**由于aa的维度较小,因此aa会升维为(1,3)
然后,由于aa升维后,aa在第1个维度上比bb小,且第1个维度为1,因此,aa会在第1个维度上扩展。bb在第2个维度上比aa小,且第2个维度为1,因此bb会在第2个维度扩展。
aa会扩展为array([[0,1,2],
[0,1,2],
[0,1,2]])
bb会扩展为array([[0,0,0],
[1,1,1],
[2,2,2]])
最后,aa+bb,就是在对应位置上的元素相加,结果为
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
例子3:
aa = np.arange(6).reshape(3,2)
bb = np.arange(3)
求:aa+bb
首先,bb的维度数较aa小,因此bb会升维为(1,3)
然后,bb在第1个维度上比aa小,且维度为1,因此bb的shape为扩展为(3,3)。aa在第2个维度上比bb小,但是其维度不为1,因此不能扩展。
最后,bb扩展后的shape为(3,3),aa的shape为(3,2),二者不匹配,报异常。
