NumPy 學習筆記一

筆記來源:python數據分析【Ivan Idris著, 韓波譯】

一、NumPy數組對象

NumPy中的多維數組稱爲ndarray,其主要有兩個部分組成

1.數據本身

2.描述數據的元數據

在數組的處理過程中,原始信息不受影響,變化只是元數據而已

np.arange()函數可以產生數組,主要用來存放一組數值的一維數組,而ndarray則可以產生具有一個及以上的維度.

向量(一維NumPy數組)的創建與及向量形狀

import numpy as np
a = np.arange(5)
print(a)                 # array([0, 1, 2, 3, 4])
print(a.shape)           # (5,)

上述向量有5個元素,數值分別是0-4,該數組的shape屬性是一個元組(單元素元組),存放的是數組在每一個維度的長度。

二、創建多維數組

import numpy as np
m = np.array([arange(2),arange(2)])
print(m) 
                    #  array([0, 1],
                    #        [0, 1]])

print(m.shape)      # (2, 2) 

在上述代碼中,使用了array()函數創建數組時,需要傳遞一個對象,這個對象就是小括號裏的內容,其內容必須爲數組類型,如這裏爲列表形式,即兩個數組組成的一個列表,該對象是array()函數唯一所需要的參數,其還可以有很多可選參數,並且這些參數都帶有預定義的缺省選項

三、NumPy的數值類型

(1)對於科學計算來說,python裏支持的整型、浮點型、複數型還不夠,仍然需要更多的數據類型,以下爲NumPy的各種數值類型

類型 說明
bool 布爾型 (True or False) 佔用1bit
inti

長度取決於平臺整數(int32 或int64)

int8 字節類型  ( -2^7    ~   2^7-1)
int16 整型         (-2^15   ~   2^15-1)
int32 整型         (-2^31   ~   2^31-1)
int64 整型           ( -2^63   ~   2^63-1)
uint8 無符號整型 ( 0  ~  2^8-1 )

uint16

無符號整型 ( 0  ~  2^16-1 )
uint32 無符號整型 ( 0  ~  2^32-1 )
uint64 無符號整型 ( 0  ~  2^64-1 )
float16

半精度浮點型

【符號爲佔1bit、指數佔5bit、尾數佔10bit】

float32

單精度浮點型 

【符號爲佔1bit、指數佔8bit、尾數佔23bit】

float64或者float

雙精度浮點型 

【符號爲佔1bit、指數佔11bit、尾數佔52bit】

complex64 複數類型(兩個32位浮點數(實部、虛部)表示)
complex128或者complex 複數類型(兩個64位浮點數(實部、虛部)表示)

謹記:不允許將複數類型轉爲整型、也不可將複數轉爲浮點數,但是可以將浮點數轉換爲複數

(2)字符碼

類型

字符碼
整型 i
無符號整型 u
單精度浮點型 f
雙精度浮點型 d
布爾型 b
複數型 D
字符串 S
萬國碼(unicode) U
空類型(Void)

V

 

相關介紹如下

import numpy as np

a = np.array(7, dtype='f')
# array(7., dtype=float32)


##### Dtype構造函數

## (1) 用python自帶的常規浮點型
print(np.dtype(float))      # float64       

## (2) 用字符碼規定單精度浮點數
print(np.dtype('f'))        # float32

## (3) 用字符碼規定雙精度浮點數
print(np.dtype('d'))        # float64

## (4)向dtype構造一個雙字符碼,其中字符表示數據類型,第二個字符爲數字(2,4,8分別對應16、32、64位)
print(np.dtype('f2'))       # float16
print(np.dtype('f4'))       # float32
print(np.dtype('f8'))       # float64


#####  dtype屬性
t = np.dtype('Float64')
print(t.char)               # 'd'      #即 dtype的屬性獲取某種數據類型(字符)對應的是字符碼

 

四、處理數組形狀

(1)reshape() 與 resize()

其中:resize() 無返回值,但對原數組進行了改變。

而reshape() 有返回值,返回的值即爲修改後的參數,但是不改變原來的數組。如下圖所示

由上圖可知,a.reshape()有返回值,但是不影響原數組a,但是通過a.resize()後無返回值,但是再次查看原數組a時,已經發生了變化。

(2) flatten() 與 ravel() 

相同: 均有返回值,而且返回值均爲對原數組拉伸爲一維的數組形式。並且此時對原數組不影響。如下所示

不同:1)flatten()函數返回的是真實的數組,即新的數組,需要分配新的內存空間。對flatten()後的數組進行變化後,不會影響原來未flatten()前的數組。即如下所示

如上圖所示,b是a先通過flatten()後的數組,佔據一個新的內存空間,不同於原數組a,所以對flatten()後的數組(即b)進行改變,即對其全部元素變爲1【即b[...]=1】,則只有b變化了,而原來沒有flatten()前的數組a並未發生改變。

2)ravel()函數返回的是一個視圖,讓其爲c,而非一個新的空間,與原數組有關,如果對該視圖進行改變,讓其所有元素變爲1,即【c[...]=1】,則c,即視圖發生變化,因爲視圖也與原數組相關,所有,原數組a也發生改變。如下圖所示

(3)堆疊數組

1) 水平疊加【  hstack()函數    或  concatenate((x,x),axis=1) 】

hstack()函數

也可以通過以concatente()函數實現【其中記住 axis =1表示水平疊加】

水平疊加過程可以表示如下圖所示

2)列式堆疊【column_stack()函數】

對一維數組進行列式堆疊時,每個一維數組即爲一個列,對每個列進行水平疊加【與水平堆疊不同】示例如下圖所示

當對二維數組進行列式堆疊時,過程與hstack()

3) 垂直疊加 【  vstack()函數    或  concatenate((x,x),axis=0) 】

也可以通過以concatente()函數實現【其中記住 axis =0表示垂直疊加】

垂直疊加過程可以表示如下圖所示

4)行式堆疊【row_stack()函數】     在一、二維堆疊時與vstack()等價

對一維數組進行行式堆疊時,每個一維數組即爲一個行,對每個行進行水平疊加【與水平堆疊相同】示例如下圖所示

當對二維數組進行行式堆疊時,過程與vstack()也相同  

5)深度疊加【dstack()函數】 

這種方法需要沿着第三個座標軸(縱向)的方向來疊加一摞數組,如,可在一個圖像數據的二維數組上疊加另一幅圖像的數據。如下所示

(4)拆分NumPy數組

【可以從橫向、縱向、深度方向進行拆分,hsplit()、 vsplit() 、dsplit()、 split() 】

1) 橫向拆分【hsplit() 類似水平堆疊 hstack() 的反過程 ,可以指定拆解的部分數,各部分一定均等、若不能均等,則不可拆分】

拆解結果如下圖示

相當於調用參數axis=1split()函數

2) 縱向拆分【vsplit() 類似垂直堆疊 vstack() 的反過程 ,可以指定拆解的部分數,各部分爲原數組的每個內部數組】

拆解結果如下圖示

相當於調用參數axis=0split()函數

3) 深向拆分【dsplit() 類似垂直堆疊 dstack() 的反過程 ,可以指定拆解的部分數】,下圖爲秩爲3的數組示例

(5)NumPy數組的屬性

1) ndim屬性存儲維度數量

2)size屬性存儲整個數組的全部元素個數

3)itemsize屬性返回數組中各個元素所佔用的字節數【一般單純的整型返回4,浮點型則爲8】

4)nbytes返回存儲整個數組所需要的字節數【nbytes 等價於 itemsize*size的值】

5)T屬性與transpose()函數相同,即轉置

6)複數的構建及實部虛部的提取

如果數組含有複數,其數據類型會自動變爲複數類型

7) flat屬性返回一個numpy.flatiter對象,是獲取flatiter對象的唯一方法,但無法訪問flatiter的構造函數,可使用flat的迭代器來遍歷數組

獲取flatiter對象、並可獲取多個元素

對flat屬性進行賦值,但這個值會覆蓋整個數組的所有元素值。也可以對特定位置元素進行進行賦值

屬性小結

(6)NumPy數組的轉換

1) 將NumPy數組轉換爲python列表形式【tolist() 函數】

2) 將數組元素轉換爲指定類型【astype() 函數】

當complex類型轉爲int類型是,虛部被丟棄。此外,還需將數據類型名稱以字符串形式'complex' 傳遞給astype()函數

參考:

[1]. Ivan Idris. 著;韓波譯.python數據分析[M].北京:人民郵電出版社,2016.2.

 

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