天天看點

手把手的numpy入門教程,從此資料處理不再慌

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

首先我們來看數組重塑,所謂的重塑本質上就是改變數組的shape。在保證數組當中所有元素不變的前提下,變更數組形狀的操作。比如常用的操作主要有兩個,一個是轉置,另外一個是reshape。

轉置與reshape

轉置操作很簡單,它對應線性代數當中的轉置矩陣這個概念,也就是說它的功能就是将一個矩陣進行轉置。

轉置矩陣的定義是将一個矩陣的橫行寫為轉置矩陣的縱列,把縱列寫成轉置矩陣的橫行。這個定義的是二維的矩陣,本質上來說,轉置操作其實是将一個矩陣沿着矩陣的大對角線進行翻轉。翻轉之後,顯然這個矩陣的各個次元都會發生變化。

其中二維的矩陣最直覺,一個4 x 3的矩陣,轉置之後得到的是3 x 4的矩陣。如果次元更多呢?如果是3 x 2 x 4的矩陣轉置之後會得到什麼?

很簡單,得到的會是4 x 2 x 3的矩陣。我們都知道,如果我們把一個矩陣各個次元的大小寫在一起,會得到一個元組(tuple),這個元組稱為矩陣的shape,我實在是不知道該怎麼翻譯這個單詞,但是我覺得叫做形狀不太妥當,是以就保留了英文原文。轉置之後,矩陣的shape會整個翻轉。比如(3, 2, 4)會變成(4, 2, 3)。

我們可以來看一個例子,會更加的直覺。首先我們先看最簡單的二維矩陣:

手把手的numpy入門教程,從此資料處理不再慌

這是随機出來的一個3 x 4的二維矩陣,在numpy當中,有兩種方式擷取一個矩陣或者是數組的轉置。第一種方式是通過在數組的變量名之後加上.T操作符,第二種方式是調用numpy中的transpose函數,這兩種方式是一樣的。我個人比較傾向于前者,寫起來比較簡單。

手把手的numpy入門教程,從此資料處理不再慌

我們可以看到轉置之後新的矩陣的第一列其實是原矩陣的第一行,第一行是原矩陣的第一列。可以看成是原矩陣按照從左上角到右下角的一條無形的線翻轉之後的結果。

了解了轉置之後,我們再來看reshape操作。其實我們從這個單詞上也能大概猜到它的意思,reshape也就是再次shape的意思,本意是根據我們想要的shape重新組裝矩陣當中的元素。

我們來看一個例子吧,首先,我們通過arange方法來擷取一個一維的數組:

手把手的numpy入門教程,從此資料處理不再慌

因為是1維的,是以我們去看它的shape也隻有一維。假設我們不喜歡這樣的一維數組,而想把它變成3 x 4或者是6 x 2的格式,這時候使用reshape就會很友善。

手把手的numpy入門教程,從此資料處理不再慌

本質上來說reshape操作其實就是按照順序從矩陣當中擷取元素,然後按照我們制定的shape填充出一個新的矩陣的操作。這個應該不難了解, 它也是非常常用的重塑操作,通過reshape和轉置,我們可以很友善地操作矩陣的大小,根據我們的需要作出改變。

三元表達式

在許多程式設計語言當中我們經常會用到三元表達式,三元表達式其實本質就是if-else語句,隻是我們用特殊的方法将它簡寫。

比如說在C++當中,我們可以把if condition A else B簡寫成:condition ? A : B。Python同樣支援三元表達式,不過對C++的三元表達式做了一些改動,在Python當中三元表達式寫成:A if condition else B。相對來說更加直覺一些,我們經常會在數組初始化的時候用到三元表達式。

比如,我們可能會這樣生成一個數組:

arr = [1 if condition else 0 for _ in range(10)]
           

我們通過條件來判斷了每一位是1還是0來生成了一個數組,簡化了代碼。在numpy當中同樣繼承了這個用法,我們一樣可以使用三元表達式,不過numpy将它封裝進了where函數當中,我們是通過調用一個方法來實作三元表達式的功能。我們來看下具體的用法,假設我們有兩個數組:

手把手的numpy入門教程,從此資料處理不再慌

我們還有一個bool型的數組c,我們希望根據c數組選擇從a數組或者是b數組當中擷取資料。我們可以使用where寫成這樣:

手把手的numpy入門教程,從此資料處理不再慌

在這個例子當中,c數組中的1和0分别表示True和False。當我們調用np.where的時候,numpy會自動根據c數組當中的值去選擇從a數組還是b數組當中擷取資料。相當于我們執行了這麼一段代碼:

[x if c else y for c, x, y in zip(c, a, b)]           

雖然兩者的運作結果是一樣的,但是顯然使用循環的方法計算耗時更長,而使用numpy的向量做法運算速度更快。除此之外,numpy的where方法還支援高維的數組,但是循環的方法不行。并且where還有一些更進階的用法,比如說我們傳入的第二個和第三個參數,可以不是數組而是一個标量。比如我們可以指定當c中的元素是True的時候填入1,否則填入-1:

手把手的numpy入門教程,從此資料處理不再慌

總結

今天的文章主要介紹了Numpy當中的reshape、轉置以及where的用法,這些也是numpy的基礎用法,尤其是轉置、reshape,幾乎是處理資料必用的方法。是以想要從事Python機器學習或者是人工智能的小夥伴,numpy的這些用法是一定要會的。

本文當中介紹的隻是numpy的一些固定套路,但其實numpy很多的用法是可以組合的,一些看似平淡無奇的用法組合在一起之後會有神奇的效果。這一點光看書或者是資料是很難窮盡的,是以如果你已經學會了這些api的基本使用,接下來最應該做的是去讀一些大牛的源碼,看看大牛們是如何運用這些工具的,相信一定還會有新的收貨。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-06-08

本文作者:承志

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”