1. 程式人生 > >numpy學習——難點解析(一)多維陣列的廣播計算方式

numpy學習——難點解析(一)多維陣列的廣播計算方式

解析引語

在歸納整理numpy的知識前,先整理一部分曾經在學習時遇到的個人認為的難點,在其他介紹基礎使用方式的文章時,方便引用此文
首先講一下廣播計算的原則:
如果兩個陣列的後緣維度(即從末尾開始算起的維度)的軸長度相符或其中一方的長度為1,則認為他們是廣播相容的。廣播會在缺失和(或)長度為1的維度上進行。

多維陣列的廣播計算方式

在剛開始學習多維陣列時,算是遇到的第一個理解方面的困難,仔細觀察了幾個小時,弄明白了計算方式,如果有問題或遺漏,歡迎在評論中指點,筆者發現問題或遺漏會在第一時間更新。

首先建立一個一維陣列
a_1 = np.arange(2).reshape(2)
>>>a_1
[0 1]
------------------------------------------------
再建立一個二維陣列
a_2 = np.arange(6).reshape(2,3)
>>>a_2
[[0 1 2]
 [3 4 5]]

此時使用a_1+a_2

>>>a_1+a_2
Traceback (most recent call last):
  File "D:/py_learn/tensorflow_test/numpy_01.py", line 13, in <module>
    print(a_2+a_1)
ValueError: operands could not be broadcast together with shapes (2,3) (2,) 

發現處理會報錯,想一下,在陣列中,第一,維度是不同的,第二,最小維度中數字個數是不同的,因此失敗。那麼,我們如果把維度改成相同,再計算一下

a_1 = np.arange(2).reshape(2,1)
[[0]
 [1]]
a_2 = np.arange(6).reshape(2,3)
[[0 1 2]
 [3 4 5]]
>>>a_1+a_2
[[0 1 2]
 [4 5 6]]

可以看到,加法進行後,得到了結果,按照格式a_2中每組數都加了a_1中對應的值
那麼,低維度的陣列是否能夠和高維度的陣列進行計算呢?
那麼嘗試一下,reshape(3)的資料

a_1 = np.arange(3).reshape(3)
>>>a_1
[0 1 2]
>>>a_1+a_2
[[0 2 4]
 [3 5 7]]

發現同樣可以進行計算,那麼我們提高維度,嘗試一下reshape(1,3)的資料

a_1 = np.arange(3).reshape(1,3)
>>>a_1
[[0 1 2]]

根據資料的結構來看,似乎只是多了一層,那效果是否和reshape(3)的資料一樣呢?
經過計算,得到結果:

[[0 2 4]
 [3 5 7]]

和reshape(1,3)的效果完全一樣,那再更高維度的陣列呢?嘗試一下
建立多個數組嘗試下

a_3 = np.arange(24).reshape(2,3,4)
a_4 = np.arange(3).reshape(1,3,1)
a_5 = np.arange(3).reshape(3,1)
a_6 = np.arange(3).reshape(1,3)
a_7 = np.arange(3).reshape(1,4)
a_8 = np.arange(6).reshape(2,3)
a_9 = np.arange(12).reshape(3,4)
a_10 = np.arange(9).reshape(3,3)

將4-10的資料分別與a_3進行加法計算,發現6、8、10均報錯,根據觀察以及嘗試,得到了結果(以shape角度解釋):
1.同維度下的陣列:
shape中有不為1的數,該數從後開始數位置與數值與被加的一致,且級數(或長度)不能超過被加的陣列,存在部分一樣時,剩餘級數必須用1代替,如(2,3,4)與(1,1,3,1)相加,(1,1,3,1)有4級,超過三級,是不可以的,另外如(2,3,4,5)與(1,3,4,1)相加,是可以的;
2.不同維度下的陣列:
同上,shape中前面的1可以省略,但後面的一定不可以!如上例中的(2,3,4,5)與(1,3,4,1)相加,可以修改為(2,3,4,5)與(3,4,1)相加,但後面的1是必須有的!

此篇先以shape的角度來講,後續會更新,以二維三維的結構角度來講,未完待續。。。