手撕numpy(四):數組的廣播機制、數組元素的底層存儲

↑ 關注 + 星標 ~ 有趣的不像個技術號

每晚九點,我們準時相約  


大家好,我是黃同學

手撕numpy系列持續更新中~

《手撕numpy(一):簡單說明和創建數組的不同方式》

《手撕numpy(二):各種特性和簡單操作》

《手撕numpy(三):切片和索引詳解》

01

數組的廣播機制

1、先來看幾個例子

a = np.array([1,3,2,5])
display(a.shape)

b = np.array([4])
display(b.shape)

c = np.arange(1,13).reshape(3,4)
display(c)
display(c.shape)

結果如下:

2、numpy官網關於廣播機制的一句原話

   In order to broadcast ,the size of the trailing axes for both arrays
in an operation must either be the same size or one of them must be one.

"翻譯如下"
    爲了更夠廣播,進行操作的兩個數組的尾部維度必須相同,或者其中一個數組的尾部維度是1。
    這個你可能會很蒙,畢竟是英譯過來的,說不定還沒有翻譯到作者所寫的那層意思,因此你簡
    單瞭解一下這個就行。下面我們會對廣播的使用做更爲詳細的總結!!!

1)什麼是廣播機制?

概念:廣播(Broadcast)是numpy對不同形狀(shape)的數組,進行數值計算的方式,對數組的算術運算通常在相對應的元素上進行。

注意:不同形狀的數組元素之間進行數值計算,會觸發廣播機制;同種形狀的數組元素之間,直接是對應元素之間進行數值計算。

2)數組與標量之間的運算

① 創建三個不同維度的數組

a = 2
display(a)

b = np.array([1,2])
display(b)

c = np.arange(1,7).reshape(3,2)
display(c)

c1 = np.arange(1,5).reshape(2,2)
display(c1)

d = np.arange(1,9).reshape(2,2,2)
display(d)

結果如下:

② 標量和一維、二維、三維數組之間的廣播運算

③ 一維數組和二維數組之間的廣播運算

⑤ 二維數組和三維數組元素之間的廣播運算

3)圖示說明:什麼樣的數據纔可以啓用廣播機制?

① 首先,我們分別構造了幾個數組;

注意:對於一個標量來說,我們可以將這一個數字的形狀看成是一行一列;對於一個一維數組,我們可以將它的形狀看成是一行多列;

② 廣播機制的詳細圖解

結論:

不同形狀的數組之間能不能觸發廣播機制,主要看對應形狀的每一個位置上的數字,是否滿足如下要求。

① 要麼對應位置上的數字完全一致,可以觸發廣播機制,比如說第Ⅵ組;

② 對應位置上的數字要是不一樣,那麼對應位置上,必須有一個數字是1,比如說Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ;

如果對應位置上的數字不僅不相同,且沒有任何一個的數字爲1,那麼就不能使用廣播機制,比如說Ⅶ。

02

數組元素的底層存儲與存儲順序說明

1、構造一個二維數組,以二維數組進行說明(二維數組用的多一些)

x = np.arange(1,13).reshape(3,4)
display(x)

結果如下:

結果分析:

當我們什麼都不指定,直接創建了一個數組後,數據默認的填充方式是,先填滿每一行,然後再填充第二行,依次進行下去。

原因是:numpy的底層是集成了C語言的,因此numpy數組元素的底層存儲也就是“C風格”的,下面我們來對這種風格進行說明。

2、C語言風格和F語言風格

1)不同風格的數組元素的底層存儲

  以二維數組來說,不管是C語言風格,還是F語言風格,他們在底層的存儲順序都是一行的,只不過最終呈現的效果屬於“虛擬展示”。這裏我先拿出來說明一下,讓大家有一個主觀印象,下面我們用兩張圖展示一下。

① C語言風格

② F語言風格

2)什麼是C語言風格和F語言風格?

  C指的就是C語言,numpy底層集成了C語言,因此當你不指定order參數的時候,默認就採用的是C語言風格,C語言風格,最右邊的索引變化最快。

  F指的就是F語言,最左邊的索引變化最快。

① 一張圖形象說明上述文字;

圖示說明:

3、案例講解

1)創建一個數組,分別使用不同的語言風格進行元素填充;

① 指定order=“C”(默認就是order=“C”)

a = np.arange(1,13)
b = a.reshape(3,4,order="C")
display(b)

結果如下:

結果分析:

② 指定order=“F”

a = np.arange(1,13)
b = a.reshape(3,4,order="F")
display(b)

結果如下:

結果分析:

近期文章,點擊圖片即可查看

後臺回覆關鍵詞「進羣」,即刻加入讀者交流羣~

先撕numpy,再撕pandas!

朱小五

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章