[開發技巧]·Numpy廣播機制的深入理解與應用
[開發技巧]·Numpy廣播機制的深入理解與應用
1.問題描述
我們在使用Numpy進行資料的處理時,經常會用到廣播機制來簡化操作,例如在所有元素都加上一個數,或者在某些緯度上作相同的操作。廣播機制很方便,但是概念卻也有些複雜,可能會讓一些初學者感到困惑,在使用過程中,產生一些錯誤。
本文以實戰演練的方式來講解廣播機制的概念與應用,不僅僅適用於Numpy,在TensorFlow,PyTorch,MxNet的廣播機制中同樣適用。
2.原理講解
廣播機制遵循一下準則:
1.首先以最長緯度為準拓展為相同緯度大小,有些緯度為零,先變為1,在進行廣播。
2.緯度上從右往左進行匹配,兩個陣列要麼在一個緯度上相同,要麼其中一個為1。
3.各個相匹配緯度上的資料都以此最長的shape為準進行復制對齊。
3.實戰演練
>>> import numpy as np >>> num1 = np.array(3) >>> num1.shape () >>> al = np.ones([1,3]) >>> bl = np.ones([4,1])*2 >>> al array([[1., 1., 1.]]) >>> bl array([[2.], [2.], [2.], [2.]])
我們新建了一些資料,其中num1是一個標量,緯度為0,al與bl都是緯度為2的矩陣
現在我們讓al+num1
>>> al_num1 = al+num1 >>> al_num1 array([[4., 4., 4.]])
根據矩陣加法的準則,兩個矩陣的形狀必須相同,對應元素相加,我們可以求得num1廣播操作時,變成了array([[3., 3., 3.]])
其實就對應上面三個法則,首先這兩個資料先進行條件1的操作,num1就變成了array([[3.]]),然後就滿足了條件2,被條件3進行了廣播。
再舉一個例子,讓al+bl,和上面例子類似,al與bl都被拓展為了shape(4,3),大家可以自己根據法則計算推理一遍。
>>> al_bl = al + bl >>> al_bl array([[3., 3., 3.], [3., 3., 3.], [3., 3., 3.], [3., 3., 3.]])
最後舉一個不符合的例子
>>> cl = np.ones([2,2])*3 >>> cl array([[3., 3.], [3., 3.]]) >>> al_cl = al + cl Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operands could not be broadcast together with shapes (1,3) (2,2)
為什麼此次廣播失敗了呢,我們可以發現cl與al的最右邊第一個緯度,大小既不相等,其中一個也不為1或者0(如果為0也會被拓展為1)。所以無法進行廣播。
Hope this helps