筆記來源: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=1的split()函數
2) 縱向拆分【vsplit() 類似垂直堆疊 vstack() 的反過程 ,可以指定拆解的部分數,各部分爲原數組的每個內部數組】
拆解結果如下圖示
相當於調用參數axis=0的split()函數
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.