Python資料分析(三)NumPy

Image for post
Image for post

此文是《10周入門資料分析》系列的第15篇

想瞭解學習路線,可以先閱讀 學習計畫 | 10周入門資料分析

----------------------------------------------------------------------------------------------------

前兩篇講了Python的基礎,今天開始進入Python資料分析工具的教程。

Python資料分析絕對繞不過的四個包是numpy、scipy、pandas還有matplotlib

numPy是Python數值計算最重要的基礎包,大多數提供科學計算的包都是用numPy的陣列作為構建基礎。專門用來處理矩陣,它的運算效率比列表更高效。

scipy是基於numpy的科學計算包,包括統計、線性代數等工具。

pandas是基於numpy的資料分析工具,能夠快速的處理結構化資料的大量資料結構和函數。

matplotlib 是最流行的用於繪製資料圖表的 Python 庫。

本文先分享NumPy包。

NumPy 的 ndarray:多維陣列物件

numpy的資料結構是n維的陣列物件,叫做ndarray。可以用這種陣列對整塊資料執行一些數學運算,其語法跟標量元素之間的運算一樣。

創建並操作多維陣列:

Image for post
Image for post

ndarray物件中所有元素必須是相同類型的,每個陣列都有一個shape和dtype。

  • shape :表示各維度大小的元組
  • dtype :說明陣列資料類型的物件
Image for post
Image for post

創建 ndarray:一種多維陣列物件

創建陣列最簡單的辦法就是使用 array 函數,它接受一切序列型物件(包括其它陣列),然後產生一個新的NumPy陣列(含有原來的資料)。

np.array會嘗試為新建的這個陣列推斷出一個較為合適的資料類型,這個資料類型保存在一個特殊的dtype物件中。

zeros 和 ones 也分別可以創建指定大小的全 0 或全 1 陣列,empty 可以創建一個沒有任何具體值的陣列(它返回的都是一些未初始化的垃圾值):

Image for post
Image for post

arange是 Python 內置函數range的陣列版,np.arange返回間隔均勻的一些值。

ndarray 的資料類型

Image for post
Image for post

dtype(資料類型)是一個特殊的物件,它含有 ndarray 將一塊記憶體解釋為特定資料類型所需的資訊。

需要知道你所處理的資料的大致類型是浮點數、複數、整數、布林值、字串,還是普通的 python 對象。當需要控制資料在記憶體和磁片中的存儲方式時,就得瞭解如何控制存儲類型。

可通過ndarray的astype方法顯示地轉換其dtype:

Image for post
Image for post

若將浮點數轉換成整數,則小數部分將會被截斷。

若某字串陣列表示的全是數位,可用astype將其轉換為數值形式:

Image for post
Image for post

這裡沒寫 np.float64 只寫了 float,但是NumPy會將 Python 類型映射到等價的dtype上。

陣列的dtype的另一個用法:

Image for post
Image for post

int_array變成了和calibers一樣的浮點型陣列

用簡潔類型的程式碼表示dtype:

Image for post
Image for post

u4(unit32):無符號的 32 位元(4個位元組)整型。

調用astype無論如何都會創建出一個新的陣列(原始資料的一份拷貝)。

浮點數只能表示近似的分數值,在複雜計算中可能會積累一些浮點錯誤,因此比較操作只在一定小數位以內有效。

陣列和標量之間的運算

陣列:可對資料執行批量運算(不用編寫迴圈即可)。這通常叫做向量化(vectorization)。

  • 大小相等的陣列之間,它們之間任何的算數運算都會應用到元素級(每個元素都做這個運算了),陣列與標量的算數運算也是。
  • 不同大小的陣列之間的運算叫做廣播(broadcasting)

基本的索引和切片

Image for post
Image for post

資料不會被複製,任何修改都直接改了原陣列。

如果僅是要一份副本,則用 .copy()。

Image for post
Image for post

這兩種方式等價。

若arr2d[2],則輸出的是一維陣列[7,8,9]。

2*2*3的陣列(2組2行3列):

Image for post
Image for post

切片索引

Image for post
Image for post

布林型索引

Image for post
Image for post

需要先引入:from numpy.random import randn

或將程式碼改成:data = np.random.randn(7, 4)

Image for post
Image for post

布林型陣列的長度必須跟被索引的軸長度一致。每個名字對應 data 陣列一行。

對條件進行否定的兩種方式:

Image for post
Image for post

組合應用多個布林條件,可使用&、|等布林算術運算子:

Image for post
Image for post

透過布林型索引選取陣列中的陣列,將總是創建資料的副本,即使返回一模一樣的陣列也是一樣。

透過布林型陣列設定值:

Image for post
Image for post

透過一維布林陣列設置整行或列的值:

Image for post
Image for post

花式索引

指利用整數陣列進行索引。

np.empty((8,4))

Return a new array of given shape and type, without initializing entries.

for i in range(8):

arr[i] = i

Return an object that produces a sequence of integers from start (inclusive)

to stop (exclusive) by step.

Image for post
Image for post

為了以特定順序選取行的子集,只需傳入一個用於指定順序的整數清單或 ndarray,使用負數索引會從末尾開始選取行(最後一行是 -1)。

一次傳入多個索引組,返回一個一維陣列:

Image for post
Image for post

取整列的兩種方法,相當於給列排了順序:

Image for post
Image for post

花式索引跟切片不一樣,總是將資料複製到新陣列中。

陣列轉置和軸對換

轉置返回的是來源資料的視圖,不進行任何複製操作。陣列有 transpose 方法,還有一個 T 屬性來完成轉置:

Image for post
Image for post

陣列
Transpose 要一個軸編號:

Image for post
Image for post

arr是 2 組 2 行 4 列的陣列,transpose的參數表示shape的形狀,對於這個例子來說,即2[0]、2[1]、4[2],transpose(1,0,2)轉置後變為2[1]、2[0]、4[2],看起來仍是 2 組 2 行 4 列的形狀,但陣列內的元素經過轉換後索引已經改變,也要遵循(1,0,2)的順序。如轉置前的陣列arr[0,1,0]索引值為 4,轉置後的陣列arr’[1,0,0],索引值才為 4。其它同理。

ndarray 的 swapaxes 方法接受一對軸編號且返回來源資料的視圖:

Image for post
Image for post

轉置後的陣列arr.T為 4[2] 組 2[1] 行 2[0] 列陣列,swapaxes(1,2)就是將第二個維度(中括弧內數位)和第三個維度交換,即轉換為 2 組 4 行 2 列。

通用函數:快速的元素級陣列函數

通用函數(即 ufunc)是一種對ndarray中的資料執行元素級運算的函數,就是一些簡單函數。

利用陣列進行資料處理

用陣列運算式代替迴圈的做法,通常被稱為向量化。NumPy 陣列將多種資料處理任務表述為陣列運算式。

Image for post
Image for post
Image for post
Image for post

np.meshgrid函數接受兩個一維陣列,並產生兩個二維矩陣(對應於兩個陣列中所有的(x, y)對。

將條件邏輯表述為陣列運算

Image for post
Image for post

np.wherea函數是三元運算式x if condition else y的向量化版本。

np.where的第二個和第三個參數不必是陣列,傳遞給where的陣列大小可以不相等,甚至可以是標量值。在資料分析工作中,where通常用於根據另一個陣列而產生一個新的陣列。

Image for post
Image for post

用where表述出更複雜的邏輯:(where的嵌套)

Image for post
Image for post
Image for post
Image for post

用於布林型陣列的方法

有兩個方法any和all。

Image for post
Image for post

排序

多維陣列可以在任何一個軸向上進行排序,只需將軸編號傳給sort:

Image for post
Image for post

頂級方法np.sort返回的陣列已排序的副本,就地排序則會修改陣列。

唯一化以及其他的集合邏輯

Image for post
Image for post

np.unique找出陣列中的唯一值並返回已排序的結果。

Image for post
Image for post

np.in1d用於測試一個陣列的值在另一個陣列的情況。

Image for post
Image for post

亂數產生

numpy.random模組多了用於高效生產多種概率分佈的樣本值的函數(用來生成大量樣本值)。

到這裡,numpy的基礎就講解的差不多了,下周將講解pandas和matplotlib。更深入的應用,後面也會分享實際應用這些包得資料分析,歡迎關注!

Image for post
Image for post

我是「數據分析那些事」。常年分享資料分析乾貨,不定期分享好用的職場技能工具。

已經有2600+的同好按贊我的臉書了,你不來嗎?XD

可以給50個clap,你們也別太辛苦,49個就行^~^!感謝支持小編

往期內容:

學習計劃|帶你10周入門資料分析

4招教你煉就資料分析的思維

數據分析慣用的5種思維方法

資料分析必備的43个Excel函式,史上最全!

實操:如何用Excel做一次完整的資料分析

寫給新人的資料庫入門指南

零基礎快速自學SQL,2天足矣!

資料視覺化技能的進階路線:SQL+BI+Echarts

數據分析必掌握的統計學知識!

不可不知描述性統計

資料分析必備的統計學(二):假設檢驗

一次讓人臉紅心跳的python數據分析

Python入門(一)環境&資料結構

Python入門(二)函數基礎

Written by

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store