Python NumPy庫入門
第一週 資料分析之表示
單元一: NumPy庫入門
資料的維度
維度:一組資料的組織形式
一維資料:一維資料由對等關係的有序或無序資料構成,採用線性方式組織,對應列表、陣列和集合等概念
列表和陣列 區別:列表的資料型別可以不同,陣列的資料型別相同
二維資料: 二維資料是有多個一維資料構成,是一維資料的組合形式。表格是典型的二維資料,其中,表頭是二維資料的一部分
多維資料:多維資料有一維或二維在新維度上擴充套件而成
高維資料:高維資料僅利用最基本的二元關係展示資料間的複雜結構。
資料維度的Python展示
資料維度是資料的組織形式
一維資料:列表和集合型別
二維資料:列表型別
多維資料:列表型別
高維資料:字典型別或資料表示格式JSON、XML、YAML格式
NumPy的陣列物件:ndarray
NumPy的介紹:
NumPy的引用:
import numpy as np
思考:Python已有列表型別,為什麼還需要一個數組物件(型別)?
-
陣列物件可以去掉元素間運算所需的迴圈,使一維向量更像單個數據
-
設定專門的陣列物件,經過優化可以提高運算速度
-
在科學計算中,一個維度所有的資料型別往往相同。陣列物件採用相同的資料型別,有助於節省運算和儲存空間
N維陣列物件:ndarray
介紹:
ndarray是一個多維陣列物件,有兩部分構成 實際的資料 ,描述這些資料的元資料(資料維度,資料型別等)
ndarray陣列一般要求所有元素型別相同(同質),陣列下標從0開始
ndarray物件的屬性
屬性 | 說明 |
---|---|
.ndim | 秩,即軸的數量或維度的數量 |
.shape | ndarray物件的尺度,對於矩陣,n行m列 |
.size | ndarray物件元素的個數,相當於.shape中n*m的值 |
.dtype | ndarray物件的元素型別 |
.itemsize | ndarray物件中每個元素的大小,以位元組為單位 |
ndarray的元素型別
資料型別 | 說明 |
---|---|
bool | 布林型別,True或False |
intc | 與C語言中的int型別一致,一般是int32或int64 |
intp | 用於索引的整數,與C語言中ssize_t一致,int32或int64 |
int8 | 位元組長度的整數,取值:\([-128,127]\) |
int16 | 16位長度的整數,取值:\([-32768,32767]\) |
int32 | 32位長度的整數,取值:\([-2^{31},2^{31}-1]\) |
int64 | 64位長度的整數,取值:\([-2^{63},2^{63}-1]\) |
uint8 | 8位無符號整數,取值:\([0,255]\) |
uint16 | 16位無符號整數,取值:\([0,65535]\) |
uint32 | 32位無符號整數,取值:\([0,2^{32}-1]\) |
uint64 | 64位無符號整數,取值:\([0,2^{64}-1]\) |
float16 | 16位半精度浮點數:1位符號位,5位指數,10位尾數 |
float32 | 32位半精度浮點數:1位符號位,8位指數,23位尾數 |
float64 | 64位半精度浮點數:1位符號位,11位指數,52位尾數 |
complex64 | 複數型別,實部和虛部都是32位浮點數 |
complex128 | 複數型別,實部和虛部都是64位浮點數 |
思考:為什麼ndarray要支援這麼多中元素型別?
對比:Python語法僅支援整數、浮點數和複數三種類型
- 科學計算涉及資料比較多,對儲存和效能都有較高要求
- 對元素型別精細定義,有助於NumPy合理使用儲存空間並優化效能
- 對元素型別精確定義,有助於程式設計師對程式規模有合理評估
非同質的ndarray物件
ndarray陣列可以由非同質物件構成,
非同質ndarray元素為物件型別,非同質物件無法發揮NumPy優勢,儘量避免
ndarray陣列的建立
ndarray陣列的建立方法
- 從Python列表、元組等型別建立ndarray陣列
- 使用NumPy中函式建立ndarray陣列,如:arange,ones,zeros等
- 從位元組流(raw,bytes)中建立ndarray陣列
- 從檔案中讀取特定格式,建立ndarray陣列
1 從Python列表、元組等型別建立ndarray陣列
2 使用NumPy中函式建立ndarray陣列,如:arange,ones,zeros等
函式 | 說明 |
---|---|
np.arrange(n) | 類似range()函式,返回ndarray型別,元素從0到n-1 |
np.ones(shape) | 根據shape生成一個全1陣列,shape是元組型別 |
np.zeros(shape) | 根據shape生成一個全0陣列,shape是元組型別 |
np.full(shape,val) | 根據shape生成一個數組,每個元素值都是val |
np.eye(n) | 建立一個正方的n*n單位矩陣,對角線為1,其餘為0 |
函式 | 說明 |
---|---|
np.ones_like(a) | 根據陣列a的形狀生成一個全1陣列 |
np.zeros_like(a) | 根據陣列a的形狀生成一個全0陣列 |
np.full_like(a,val) | 根據陣列a的形狀生成一個數組,每個元素值都是val |
np.linspace() | 根據起止資料等距填充資料,形成陣列 |
np.concatenate() | 將兩個或多個數組合併成為一個新的陣列 |
ndarray陣列的變換
對於·建立後的ndarray陣列可以對其進行維度變換和元素型別變換
ndarray陣列的維度變換
方法 | 說明 |
---|---|
.reshape(shape) | 不改變陣列元素,返回一個shape形狀的陣列,原陣列不變 |
.resize(shape) | 與reshape()功能一致,但修改原陣列 |
.swapaxes(ax1,ax2) | 將陣列n個維度中的兩個維度進行調換 |
.flatten() | 對陣列進行降維,返回摺疊後的一維陣列,原陣列不變 |
ndarray陣列的型別轉換
new_a = a.astype(new_type)
astype()方法一定會建立新的陣列(原始資料的一個拷貝),即使兩個型別一致
ndarray陣列向列表的轉換
ls = a.tolist()
ndarray陣列的索引與切片
索引: 獲取陣列中特定位置元素的過程
切片:獲取陣列元素子集的過程
一維陣列的索引與切片:與Python的列表類似
起始編號:終止編號:步長
**編號0從左端遞增,或-1從右端遞減 **
多維陣列的索引:
每個維度一個索引值,逗號分割
多維陣列的切片:
選取一個維度用: 每個維度切片方法與一維陣列相同 每個維度可以使用步長跳躍切片
ndarray陣列與標量之間的運算
陣列與標量之間的運算作用於陣列的每個元素
NumPy一元函式
對ndarray中的資料執行元素級別的函式
注意陣列是否被改變