今天是numpy專題的第四篇文章,numpy中的陣列重塑與三元表示式。
首先我們來看陣列重塑,所謂的重塑本質上就是改變陣列的shape。在保證陣列當中所有元素不變的前提下,變更陣列形狀的操作。比如常用的操作主要有兩個,乙個是轉置,另外乙個是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)。
我們可以來看乙個例子,會更加的直觀。首先我們先看最簡單的二維矩陣:
這是隨機出來的乙個3 x 4的二維矩陣,在numpy當中,有兩種方式獲取乙個矩陣或者是陣列的轉置。第一種方式是通過在陣列的變數名之後加上.t操作符,第二種方式是呼叫numpy中的transpose函式,這兩種方式是一樣的。我個人比較傾向於前者,寫起來比較簡單。
我們可以看到轉置之後新的矩陣的第一列其實是原矩陣的第一行,第一行是原矩陣的第一列。可以看成是原矩陣按照從左上角到右下角的一條無形的線翻轉之後的結果。
理解了轉置之後,我們再來看reshape操作。其實我們從這個單詞上也能大概猜到它的意思,reshape也就是再次shape的意思,本意是根據我們想要的shape重新組裝矩陣當中的元素。
我們來看乙個例子吧,首先,我們通過arange方法來獲取乙個一維的陣列:
因為是1維的,所以我們去看它的shape也只有一維。假設我們不喜歡這樣的一維陣列,而想把它變成3 x 4或者是6 x 2的格式,這時候使用reshape就會很方便。
本質上來說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
0for _ in range(10)]
我們通過條件來判斷了每一位是1還是0來生成了乙個陣列,簡化了**。在numpy當中同樣繼承了這個用法,我們一樣可以使用三元表示式,不過numpy將它封裝進了where函式當中,我們是通過呼叫乙個方法來實現三元表示式的功能。我們來看下具體的用法,假設我們有兩個陣列:
我們還有乙個bool型的陣列c,我們希望根據c陣列選擇從a陣列或者是b陣列當中獲取資料。我們可以使用where寫成這樣:
在這個例子當中,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:
甚至我們還可以將標量和向量結合起來使用:
並且這裡的陣列c也可以替換成邏輯運算:
今天的文章主要介紹了numpy當中的reshape、轉置以及where的用法,這些也是numpy的基礎用法,尤其是轉置、reshape,幾乎是處理資料必用的方法。所以想要從事python機器學習或者是人工智慧的小夥伴,numpy的這些用法是一定要會的。
本文當中介紹的只是numpy的一些固定套路,但其實numpy很多的用法是可以組合的,一些看似平淡無奇的用法組合在一起之後會有神奇的效果。這一點光看書或者是資料是很難窮盡的,所以如果你已經學會了這些api的基本使用,接下來最應該做的是去讀一些大牛的原始碼,看看大牛們是如何運用這些工具的,相信一定還會有新的收貨。
本文使用 mdnice 排版
Django 手把手帶你入門
一 開發環境 python 2.7 pycharm 4 二 django的安裝 開啟pycharm 新建專案 看圖操作 自動安裝django環境 三 建立第乙個 1.開啟views.py 匯入 編寫乙個index函式 先寫成硬編碼的形式 2.開啟urls.py 匯入上圖編寫的函式 在urlpatte...
手把手帶你構建SpringBoot專案
springboot引言 spring boot是由pivotal團隊提供的全新框架,其設計目的是用來簡化新spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。總要求 約定 配置 編碼 構建專案 1 建立springboot專案 註解總結...
Windows服務 手把手帶你體驗
microsoft windows 服務 即,以前的 nt 服務 使您能夠建立在它們自己的 windows 會話中可長時間執行的可執行應用程式。這些服務可以在計算機啟動時自動啟動,可以暫停和重新啟動而且不顯示任何使用者介面。這使服務非常適合在伺服器上使用,或任何時候,為了不影響在同一臺計算機上工作的...