当前位置: 首页 > 后端技术 > Python

NumPy-UnderstandingBroadcasting

时间:2023-03-26 13:50:53 Python

简介Broadcasting描述了NumPy如何计算不同形状数组之间的运算。如果一个较大的矩阵和一个较小的矩阵进行运算,则广播较小的矩阵以确保运算正确。本文将结合具体实例详细讲解NumPy中广播的使用。BasicBroadcasting一般情况下需要计算两个数组,所以每个数组的对象都需要有对应的值进行计算。例如下面的例子:a=np.array([1.0,2.0,3.0])b=np.array([2.0,2.0,2.0])a*barray([2.,4.,6.])但是如果使用Numpy的broadcast特性,就不需要精确对应元素个数了。例如,我们可以将一个数组乘以一个常数:a=np.array([1.0,2.0,3.0])>>>b=2.0>>>a*barray([2.,4.,6.])下面的例子等同于上面的例子,Numpy会自动展开b。NumPy足够聪明,可以使用原始标量值而无需实际制作副本,从而使广播操作尽可能节省内存和计算效率。第二个示例中的代码比第一个示例中的代码更高效,因为广播在乘法期间移动的内存更少(b是标量而不是数组)。广播规则如果对两个数组进行操作,NumPy会比较两个数组的对象,从最后一个维度开始,如果两个数组的维度满足以下两个条件,我们认为两个数组是兼容的,可以进行操作:维度中的元素个数相同,其中一个维度为1。如果不满足以上两个条件,会抛出异常:ValueError:operandscouldnotbebroadcasttogether。一个维度中的元素数量相同这一事实并不意味着要求两个数组具有相同的维度数量。例如,表示颜色的256x256x3数组可以乘以3个元素的一维数组:Image(3darray):256x256x3Scale(1darray):3Result(3darray):256x256x3multiplication当一个维度的元素个数为1时,会被拉伸到与另一个维度的元素个数一致:A(4darray):8x1x6x1B(3darray):7x1x5Result(4darray):8x7x6x5上例中,第二维的1被拉伸为7,第三维的1被拉伸为6,第四维的1被拉伸为5.还有更多例子:B(1darray):1Result(2darray):5x4A(2darray):5x4B(1darray):4Result(2darray):5x4A(3darray):15x3x5B(3d阵列):15x1x5Result(3d阵列):15x3x5A(3d阵列):15x3x5B(2d阵列):3x5Result(3d阵列):15x3x5A(3d数组):15x3x5B(2d数组):3x1结果(3d数组):15x3x5这是不匹配的示例:A(1d数组):3B(1d数组):4#尾随维度不匹配A(2darray):2x1B(3darray):8x4x3#倒数第二个维度不匹配实际代码的另一个例子:>>>x=np.arange(4)>>>>xx=x.reshape(4,1)>>>y=np.ones(5)>>>z=np.ones((3,4))>>>x.shape(4,)>>>y.shape(5,)>>>x+yValueError:操作数无法与形状一起广播(4,)(5,)>>>xx.shape(4,1)>>>y.shape(5,)>>>(xx+y).shape(4,5)>>>xx+yarray([[1.,1.,1.,1.,1.],[2.,2.,2.,2.,2.],[3.,3.,3.,3.,3.],[4.,4.,4.,4.,4.]])>>>x.shape(4,)>>>z.shape(3,4)>>>(x+z).shape(3,4)>>>x+zarray([[1.,2.,3.,4.],[1.,2.,3.,4.],[1.,2.,3.,4.]])broadcasting也为两个一维数组的外积提供了非常方便的操作:>>>a=np.array([0.0,10.0,20.0,30.0])>>>b=np.array([1.0,2.0,3.0])>>>a[:,np.newaxis]+barray([[1.,2.,3.],[11.,12.,13.],[21.,22.,23.],[31.,32.,33.]])其中a[:,np.newaxis]将一维数组转换为四维数组:In[230]:a[:,np.newaxis]Out[230]:array([[0.],[10.],[20.],[30.]])本文已收录于http://www.flydean。com/07-python-numpy-broadcasting/最通俗的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!