Python乾貨 | Python數據分析之numpy數組全解析

2021-03-02 Python綠色通道

1 什麼是numpy

2 numpy數組創建

2.1 基本方法:np.array()

2.2 通用方法:np.ones()、np.zeros()、np.eye()

2.3 讀取外部數據

3 numpy中數組的數據類型

4 numpy中數組的形狀

5 索引與切片

5.1 按索引取值

5.2 bool索引

6 numpy中賦值、視圖、深複製

什麼是numpy

numpy是一個在Python中做科學計算的基礎庫,重在數值計算,也是大部分Python科學計算庫的基礎庫,多用於大型、多維數據上執行數值計算。

在NumPy 中,最重要的對象是稱為 ndarray 的N維數組類型,它是描述相同類型的元素集合,numpy所有功能幾乎都以ndarray為核心展開。ndarray 中的每個元素都是數據類型對象(dtype)的對象。ndarray 中的每個元素在內存中使用相同大小的塊

numpy數組創建

創建Numpy數組一般有三種方法:

(1)通過傳入可待跌對象創建,我將之稱為基本方法

(2)使用Numpy內部功能函數,內部方法

(3)使用特殊的庫函數,特殊方法

基本方法:np.array()基本方法是通過給numpy提供的一些函數中傳入可迭代對象來創建數組,這種方法通常是在已知所有元素的情況下使用。numpy中實現這種功能的函數包括:np.array()、np.arange()、np.line(),:

np.array([0, 1, 2, 3, 4]) # 接收一個list作為參數array([0, 1, 2, 3, 4])>>> np.array([[11, 12, 13],[21, 22, 23]]) # 創建一個2*3的數組array([[11, 12, 13],[21, 22, 23]])>>> np.array((0, 1, 2, 3, 4)) # 接收一個tuple作為參數array([0, 1, 2, 3, 4])np.array()方法可以在創建數組的同時指定數據類型:>>> np.array([0, 1, 2, 3, 4], dtype=float)array([0., 1., 2., 3., 4.])

甚至還可以接受range()返回的可迭代對象作為參數:

>>> np.array(range(5))array([0, 1, 2, 3, 4])>>> np.array(range(10, 20, 2))array([10, 12, 14, 16, 18])

通用方法:np.ones()、np.zeros()、np.eye()

通用方法指的是numpy中提供的arange()、ones()、zeros()、eye()、full()等方法,這些方法可以按照某種規則生成一個數組,並不需要傳入已知的可迭代對象。

(1)np.arange()

上面我們將range()函數結果傳遞給np.array(),np.arange()實現的就是這個功能,所以說,np.arange()就是numpy中的range()方法。

>>> np.arange(5)array([0, 1, 2, 3, 4])>>> np.arange(10, 20, 2)array([10, 12, 14, 16, 18])(2)np.linspace()

np.linspace()方法以等間距的形式對給定的兩數進行劃分來創建數組:

>>> np.linspace(10, 20, 5) # 將10到20間的數等距取5個array([10. , 12.5, 15. , 17.5, 20. ])

(3)np.ones()

創建一個元素值全為1的數組,接收一個list或者tuple作為參數

>>> np.ones([2]) # 創建一個一維數組array([1., 1.])>>> np.ones([2, 2]) # 創建一個2維數組array([[1., 1.],[1., 1.]])>>> np.ones([2, 2, 2])array([[[1., 1.],[1., 1.]], [[1., 1.],[1., 1.]]])

(4)np.zeros()

創建一個元素值全為0的數組,接收一個list或者tuple作為參數

>>> np.zeros([3])array([0., 0., 0.])>>> np.zeros([3, 3])array([[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]])

(5)np.random.random()

創建一個元素為0到1之間隨機數的數組,接收一個list或者tuple作為參數:

>>> np.random.random((3, 3))array([[0.19414645, 0.2306415 , 0.08072019],[0.68814308, 0.48019088, 0.61438206],[0.5361477 , 0.33779769, 0.38549407]])

既然有random()方法,那麼就會有randint()方法,也就是取隨機整數的方法,不過這個randint()方法參數形式更random()不太一樣,具體請看下面實例:

>>> np.random.randint(1, 10, 3) # 從1到10之間隨機取3個整數創建數組array([6, 4, 6])

(6)np.eye()

創建一個從左上角到右下角的對角線上全為1,其餘元素全為0的數組(單位矩陣)。注意,np.eye()的參數可不再是list或者tuple了。

>>> np.eye(3, 3)array([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])

(7) np.full()

np.full()函數可以創建一個填充給定數值的數組,第一個參數是定義數組形狀的list或tuple,第2個參數是需要填充的數值:

>>> np.full((2, 3), 3) # 創建一個2*3的數組,所有元素都填充3array([[3, 3, 3],[3, 3, 3]])

讀取外部數據

numpy也支持從外部讀取數據來創建數組,例如從硬碟中讀取csv、txt等文件來創建數組。np.genfromtxt()是numpy中讀取文件的一個方法,例如在當前目錄下有一個data.csv文件,文件內容為:

id,height,length

1,100,101

2,200,230

3,300,350

通過numpy讀取:

>>> np.genfromtxt('data.csv',delimiter=',',skip_header=1)array([[ 1., 100., 101.],[ 2., 200., 230.],[ 3., 300., 350.]])

讀取外部數據的方法不止np.genfromtxt(),還有np.load(等,但numpy讀取外部數據的應用情況其實並不多,這裡不再細說。

numpy中數組的數據類型

作為一個強大的科學計算庫,numpy中支持的數據類型遠不止Python原生的幾種數據類型。如下所示為numpy中支持的數據類型:

這些數據類型可以通過如np.bool_、np.float16等形式來調用,上文中提到過,創建數組時可以指定數據類型:

>>> a = np.array([0, 1, 0, 1], dtype=np.bool_)>>> aarray([False, True, False, True])

可以通過numpy數組自帶的dtype屬性來查看數組的數據類型:

為什麼輸出的類型是bool而不是bool_呢?因為numpy中後綴帶下劃線「_」的數據類型指向的就是Python原生的數據類型,也就是說,np.bool_與Python中的bool數據類型等效,np.float_與Python中的float類型等效。

當一個數組已經被創建,但是想要改變其數據類型,那就可以通過np.asdtype()方法:

>>> a.astype(np.int)array([0, 1, 0, 1])>>> a = np.random.random((2,2))>>> aarray([[0.02914317, 0.645534 ],[0.61839509, 0.64155607]])>>> a.dtypedtype('float64')>>> a.astype(np.float16)array([[0.02914, 0.6455 ],[0.618 , 0.6416 ]], dtype=float16)>>> a.dtypedtype('float64')

numpy中數組的形狀

numpy中數組使用與存放多維數據,所以,所謂數組的形狀指的就是數據的維度大小,以及每一維度元素個數。我們可以通過數組自帶的shape屬性來查看形狀信息:

>>> a = np.array([[2, 3, 4], [5, 6, 7]])>>> aarray([[2, 3, 4],[5, 6, 7]])>>> a.shape # 查看形狀屬性(2, 3)

可以看到,查看形狀屬性時返回的是一個元組,元素的長度代表數組的維度,元組每一個屬性代表對應的維度的元素個數,(2,3)就表示第一個維度元素個數是2(兩行),第二個維度長度是3(3列)。

在數組創建之後,數組的形狀也是可以改變的。改變數組的形狀通過數組的reshape()方法:

>>> a = np.ones((2, 12))>>> aarray([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])>>> a.shape(2, 12)>>> b = a.reshape(2, 3, 4)>>> barray([[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]], [[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]]])>>> b.shape(2, 3, 4)>>> b = a.reshape((2,3,4)) # 元組作為參數>>> barray([[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]], [[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]]])>>> b.shape(2, 3, 4)

可以看到,np.reshape()方法可以同時傳入多個描述形狀的數字,也可以傳入一個數組,當然,如果將形狀改變為一維數組時,必須傳入的是元組。另外需要注意,傳入reshape方法的多個參數的乘積必須與改變前數組總長度相等,否則會報錯。

numpy數組中專門提供了一個方法加你個數組轉換為以為數組,那就是flatten()方法,這個方法在執行數組運算是非常有用:

>>> a = np.ones((2, 3))>>> b = a.flatten()>>> barray([1., 1., 1., 1., 1., 1.])>>> b.shape(6,)

索引與切片

對數據使用時,不可避免要進行索引和切片,numpy在這一方面不可謂不強大。numpy數組中所有的索引都是從0開始的,我們可以根據索引來精確取數據。

按索引取值下面所有實例都已下方數組a來展開:

>>> a = np.arange(36).reshape((4, 9))>>> aarray([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],[ 9, 10, 11, 12, 13, 14, 15, 16, 17],[18, 19, 20, 21, 22, 23, 24, 25, 26],[27, 28, 29, 30, 31, 32, 33, 34, 35]])

(1)取一行

>>> a[1] # 取第二行數據array([ 9, 10, 11, 12, 13, 14, 15, 16, 17])

(2)取連續多行數據

>>> a[:2] # 取前兩行數據array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],[ 9, 10, 11, 12, 13, 14, 15, 16, 17]])

也可以加上步長:

>>> a[::2] # 每隔一行取一次array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],[18, 19, 20, 21, 22, 23, 24, 25, 26]])>>> a[1:] # 取第2行後面所有行array([[ 9, 10, 11, 12, 13, 14, 15, 16, 17],[18, 19, 20, 21, 22, 23, 24, 25, 26],[27, 28, 29, 30, 31, 32, 33, 34, 35]])

(3)取不連續多行數據

>>> a[[0,-1]] # 取第一行和最後一行>>> a[[0,-1]]array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],[27, 28, 29, 30, 31, 32, 33, 34, 35]])

可以看到,對numpy根據索引進行取值的方法與Python中list索引取值方法類似,都是通過方括號裡面傳入索引取值,當需要對多維進行索引時,每一位數據之間用逗號隔開。

(4)取一列

>>> a[:,1] # 取第2列array([ 1, 10, 19, 28])

(5)取連續多列

>>> a[:,1:3] # 取第2列到第3列array([[ 1, 2],[10, 11],[19, 20],[28, 29]])

(6)取不連續多列

>>> a[:,[0,3]] # 取第1列和第4列array([[ 0, 3],[ 9, 12],[18, 21],[27, 30]]))

(7)取連續多行多列

>>> a[1:3:,1:3] # 取第2、3行中的第2、3列array([[10, 11],[19, 20]])

(8)取多個不連續位置數據

看到這裡你應該也明白了取行、取列的規律了,如果取不連續的多行多列呢?例如取第1、3行與第2、4列,你可能認為是a[[0, 2], [1, 3]],我們來看看:

>>> a[[0, 2], [1, 3]]array([ 1, 21])

可見,返回的並不是預期的數據,而是第1行第2列、第3行第4列的數據,也就是(0,1)和(2,3)位置的數據。

從而我們可以得出結論,如果取第3行中第3列、第5列,第4行中第1列、第7列數據方法如下:

>>> a[[2,2,3,3],[2,4,0,6]] # 第3行中第3列、第5列,第4行中第1列、第7列數據array([20, 22, 27, 33])

(9)取單個數據

>>> b = a[3,3]>>> b30>>> type(b) # 取單個類型是返回的就是一個確切的numpy類型數值<class 'numpy.int64'>

bool索引

(1)bool索引取值

numpy中提供了一些通用函數來實現通過bool條件判斷實現按條件取值,使用這些通用方法,與使用對應的符號時等效的,符號與numpy通用方法對應關係如下:

運算符 對應的通用函數

==	np.equal!=	np.not_equal<	np.less<=	np.less_equal>	np.greater>=	np.greater_equal

我們通過實例感受一下:

>>> a = np.arange(24).reshape((4,6))>>> aarray([[ 0, 1, 2, 3, 4, 5],[ 6, 7, 8, 9, 10, 11],[12, 13, 14, 15, 16, 17],[18, 19, 20, 21, 22, 23]])>>> b = a<5 # bool索引選取>>> barray([[ True, True, True, True, True, False],[False, False, False, False, False, False],[False, False, False, False, False, False],[False, False, False, False, False, False]])

可以看到,在元素值小於5的位置上值為True,不滿足條件的為False。

也可以使用通用函數實現:

>>> b = np.less(a,5) # 通用函數選取>>> barray([[ True, True, True, True, True, False],[False, False, False, False, False, False],[False, False, False, False, False, False],[False, False, False, False, False, False]])

對bool索引選取出來的結果全是True或者False,可能不是你想要的,可以進一步使用:

>>> a[b]array([0, 1, 2, 3, 4])

所以我們可以直接刷選值:

>>> a[a<5]array([0, 1, 2, 3, 4])

(2)三目元算

numpy中提供了一個where()方法來實現三目運算。where()方法接受三個參數,第一個參數是判斷條件,第二個參數時時判斷條件為真時數組中滿足條件的元素將要替換的值,第三個參數是判斷調價為假時不滿足條件元素將要替換的值。

例如,將數組中所有滿足元素值小於5的數值替換為0,不滿足的元素值替換為1:

>>> a = np.arange(24).reshape((4,6))>>> aarray([[ 0, 1, 2, 3, 4, 5],[ 6, 7, 8, 9, 10, 11],[12, 13, 14, 15, 16, 17],[18, 19, 20, 21, 22, 23]])>>> np.where(a<5, 0, 1) # 三目運算array([[0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1]])

numpy中賦值、視圖、深複製

(1)賦值

當對numpy數組進行賦值時,只是對同一個對象新建了一個引用,並不是建立新的對象,所以賦值前後的變量完全是同一對象,對其中一個引用修改時,所有引用都會生效:

>>> a = np.arange(12)>>> b = a # 賦值>>> a is bTrue>>> b.shape = (3, 4)>>> barray([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])>>> aarray([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])

(2)視圖(切片、淺複製)

numpy中允許不同數組間共享數據,這種機制在numpy中稱為視圖,對numpy數組的切片和淺複製都是通過視圖實現的。如果數組B是數組A的視圖(view),則稱A為B的base(除非A也是視圖)。視圖數組中的數據實際上保存在base數組中。

>>> a = np.arange(12)>>> b = a.view() # 使用視圖>>> a is bFalse>>> barray([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> b.shape = (3, 4) # 改變b的形狀>>> aarray([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> barray([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])>>> b[0] = 0>>> aarray([ 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11])>>> barray([[ 0, 0, 0, 0],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])

從上面代碼中我們可以發現,a和b是不同的兩個數組,改變b的形狀對a不會有影響,但是改變b的數據之後,a的數據也會發現改變,說明a與b是共享數據的。

再來探索一些切片:

>>> a = np.arange(12)>>> b = a[:] # 切片>>> a is bFalse>>> b.shape = (3, 4)>>> aarray([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> barray([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])>>> b[0] = 0>>> aarray([ 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11])>>> barray([[ 0, 0, 0, 0],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])

果然,切片效果與視圖一致。

(3)深複製

深複製通過數組自帶的copy()方法實現,深複製產生的數組與原數組時完全不同的兩個數組對象,完全享有獨立的內存空間,所有操作都不會相互影響。

>>> a = np.arange(12)>>> b = a.copy()>>> a is bFalse>>> b.shape = (3, 4)>>> b[0] = 0>>> aarray([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])>>> barray([[ 0, 0, 0, 0],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])

相關焦點

  • python數據分析專題 (9):numpy基礎
    NumPy(Numerical Python的簡稱)是高性能科學計算和數據分析的基礎包。NumPy最重要的一個特點就是其N維數組對象(即ndarray),該對象是一個快速而靈活的大數據集容器。新手可能不理解這句話的含義,這個需要慢慢去理解 。總之,知道numpy是python數據分析最重要的基礎包就可以了。
  • Python數據分析之numpy數組全解析
    1 什麼是numpy2 numpy數組創建2.1 基本方法:np.array()2.2 通用方法:np.ones()、np.zeros()、np.eye()2.3 讀取外部數據3 numpy中數組的數據類型4 numpy中數組的形狀5 索引與切片5.1 按索引取值
  • python數據分析:numpy入門
    微信公眾號:學點啥玩點啥小白友好型python數據分析:numpy入門numpy:一個在python中做科學計算的基礎庫,重在數值計算,也是大部分python科學計算庫的基礎庫,多用於在大型、多維數組上執行數值計算。
  • Python之numpy數組學習(一)
    Numpy中的多維數組稱為ndarray,它有兩個組成部分。在數組的處理過程中,原始數據不受影響,變化的只是元數據。Numpy數組通常是由相同種類的元素組成,即數組中數據類型必須一致。好處是:數組元素類型相同,可輕鬆確定存儲數組所需的空間大小。同時,numpy可運用向量化運算來處理整個數組。Numpy數組的索引從0開始。
  • python數據分析專題 (7):python數據分析模塊
    也就是這些python的擴展包讓python可以做數據分析,主要包括numpy,scipy,pandas,matplotlib,scikit-learn等等諸多強大的模塊,在結合上ipython交互工具 ,以及python強大的爬蟲數據獲取能力,字符串處理能力,讓python成為完整的數據分析工具。
  • 學員筆記||Python數據分析之:numpy入門(一)
    (點擊上方公眾號,快速關注一起學AI)這是我學<Python數據分析>時整理出來的numpy基礎速讀筆記,內容大致分為
  • Python之numpy數組學習(三)
    作者  Airy本文轉自AiryData,轉載需授權前面我們學習了numpy庫的簡單應用和數組的處理,今天來學習下比較重要的如何拆分數組。itemsize屬性可以返回數組中各個元素所佔用的字節數。nbytes屬性存儲整個數組所需的字節數量。這個屬性的值正好是itemsize和size屬性值的積。T屬性的作用和transpose()函數相同。如果數組的秩(rank)小於2,那麼所得只是一個數組的視圖。對於numpy來說,複數用j表示。
  • Python之numpy零基礎入門(一)
    當創建好一個ndarray數組時,同時會在內存中儲存它的shape(維度大小)和dtype(數據類型)import numpy as npa=[1,2,3,4,5,6]arr=np.array(a)print(arr)print(arr.shape)print(arr.dtype)
  • Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞
    python使用ctypes模塊調用DLL函數之傳遞數值、指針與字符串參數、一般情況下,DLL函數中傳遞C語言類型的數組,在接收到Python語言中時,通常將其轉換為numpy庫裡面的數組類型,這樣做的好處是可以藉助於numpy強大的分析處理功能對數據直接作後續處理。這次通過例子演示下C語言數組到numpy數組之間是怎樣傳遞的。
  • Python數據分析 - Numpy
    前言NUMPY(以下簡稱NP)是Python數據分析必不可少的第三方庫,np的出現一定程度上解決了Python運算性能不佳的問題,同時提供了更加精確的數據類型。如今,np被Python其它科學計算包作為基礎包,已成為Python 數據分析的基礎,可以說,NP是SciPy、Pandas等數據處理或科學計算庫最基本的函數功能庫。因此,理解np的數據類型對python數據分析十分有幫助。下面,本文將介紹Np的常用操作和基本數據類型。NP提供了以下重點功能。
  • python數據分析專題 (10):numpy使用
    NumPy的ndarry類型也可以進行很多操作,例如數組的索引,組合等,這次內容介紹一些關於numpy多維數組的操作。
  • Python冬令營-Numpy 使用簡介
    source: https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial聲明:本篇推送的主要內容翻譯自:https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial
  • Python的武器庫05:numpy模塊(下)
    說到程式語言python,有一個著名的格言"餘生太短,只用python"。如果要分析為什麼會存在這麼一句格言?python的語法並不簡單,有複雜難懂的部分,之所以有這樣一句格言,是因為python中有很多強大的模塊,就像一個武器庫。
  • Python之numpy數組學習(四)——索引和視圖
    在學習ravel()函數的時候,我看到了視圖的概念,這讓我很驚訝,但是注意,這裡的視圖和資料庫中的視圖不是一樣的。在numpy中,視圖不是只讀的。關鍵在於,當前處理的是共享的數組視圖,還是數組數據的副本。舉例來說,可以取數組的一部分來生成視圖,這意味著,如果先將數組的某部分賦值給一個變量,然後修改原數組中相應位置的數據,那麼這個變量的值也會隨之變化。
  • Python數據科學Numpy基礎20問
    1、什麼是numpy?一言以蔽之,numpy是python中基於數組對象的科學計算庫。提煉關鍵字,可以得出numpy以下三大特點:2、如何安裝numpy?因為numpy是一個python庫,所以使用python包管理工具pip或者conda都可以安裝。
  • Python 數據分析:Numpy 介紹
    如今,np被Python其它科學計算包作為基礎包,已成為Python 數據分析的基礎,可以說,NP是SciPy、Pandas等數據處理或科學計算庫最基本的函數功能庫。因此,理解np的數據類型對python數據分析十分有幫助。下面,本文將介紹Np的常用操作和基本數據類型。NP提供了以下重點功能。
  • 好程式設計師Python培訓分享numpy簡介
    好程式設計師Python培訓分享numpy簡介:一、numpy簡介:NumPy是一個功能強大的Python庫,主要用於對多維數組執行計算。NumPy這個詞來源於兩個單詞-- Numerical和Python。NumPy提供了大量的庫函數和操作,可以幫助程式設計師輕鬆地進行數值計算。
  • 從零開始學Python數據分析【4】-- numpy
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析
  • 大數據分析Python NumPy庫使用教程
    NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
  • 學員筆記|Python數據分析之numpy入門(三)
    numpy ufunc運算ufunc是universal function的縮寫,它是一種能對數組的每個元素進行操作的函數求和我們可以像在python裡進行數值運算一樣 ,直接運行:x+y該圖用顏色標識出了,逐元素求和的過程。這個很容易理解。