广播机制用于处理两个不同维度数组之间的操作,这里只讨论不超过两维的数组广播机制。
【a】标量和数组的操作
当一个标量和数组进行运算时,标量会自动把大小扩充为数组大小,之后进行逐元素操作:
res = 3 * np.ones((2,2)) + 1 res
array([[4., 4.], [4., 4.]])
res = 1 / res res
array([[0.25, 0.25], [0.25, 0.25]])
【b】二维数组之间的操作
当两个数组维度完全一致时,使用对应元素的操作,否则会报错,除非其中的某个数组的维度是m×1或者1×n,那么会扩充其具有1的维度为另一个数组对应维度的大小。例如,1×2数组和3×2数组做逐元素运算时会把第一个数组扩充为3×2,扩充时的对应数值进行赋值。但是,需要注意的是,如果第一个数组的维度是1×3,那么由于在第二维上的大小不匹配且不为1,此时报错。
res = np.ones((3,2)) res
array([[1., 1.], [1., 1.], [1., 1.]])
res * np.array([[2,3]]) # 第二个数组扩充第一维度为3
array([[2., 3.], [2., 3.], [2., 3.]])
res * np.array([[2],[3],[4]]) # 第二个数组扩充第二维度为2
array([[2., 2.], [3., 3.], [4., 4.]])
res * np.array([[2]]) # 等价于两次扩充,第二个数组两个维度分别扩充为3和2
array([[2., 2.], [2., 2.], [2., 2.]])
【c】一维数组与二维数组的操作
当一维数组A_k与二维数组B_{m,n}操作时,等价于把一维数组视作A_{1,k}的二维数组,使用的广播法则与【b】中一致,当k!=n且k,n都不是1时报错。
np.ones(3) + np.ones((2,3))
array([[2., 2., 2.], [2., 2., 2.]])
np.ones(3) + np.ones((2,1))
array([[2., 2., 2.], [2., 2., 2.]])
np.ones(1) + np.ones((2,3))
array([[2., 2., 2.], [2., 2., 2.]])