numpy庫
英文官方文檔:https://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
一、numpy庫中的數組對象:N維數組類型:ndarray
1) ndarray的作用:
a) 數組對象性可以去掉元素間運算所需的循環,使一維向量更像單個數據。
b) 設置專門的數組對象,經過優化,可以提升這類應用的運算速度。
2) ndarray是一個多維數組對象,有兩部分組成:
實際的數據 和 描述這些數據的元數據(數據維度、數據類型等)
ndarray數組一般要求所有元素類型相同(同質),數組下標從零開始
3) ndarray實例對象的屬性:
.ndim:秩,即軸的數量或維度的數量
.shape:ndarray對象的尺度,對於矩陣,n行m列
.size:ndarray對象元素的個數,相當於.shape中的n*m
.dtype:ndarray對象的元素類型
.itemsize:ndarray對象中的每個元素的大小,以字節為單位
4) ndarray的元素類型:
數據類型 |
說明 |
bool |
布爾類型,True or False |
intc |
與C語言中的int類型一致Int32或int6 |
intp |
用於索引的整數,與C語言中的ssize_t一致,int2或int64 |
int8 |
8字節長度的整數,取值[-128,127] |
int16/int32/int64 |
類似int8 |
uint8 |
8位無符正數,取值[0,255] |
uint16/uint32/uint64 |
類似uint8 |
float16 |
16位半精度浮點數:1位符號位,5位指數(10^指數),10位尾數 |
float32 |
類似float16;1為符號位,8位指數,23位尾數 |
float64 |
類似float16;1為符號位,11位指數,52位尾數 |
complex64 |
復數類型,實部和虛部都是32位浮點數 |
complex128 |
復數類型,實部和虛部都是64位浮點數 |
對比:python語法只支持整數,浮點數和復數3種類型
而科學計算對數據的類型,精度都有較高要求
注意:非同質的ndarray無法有效發揮numpy優勢,盡量避免使用
5) ndarray數組的創建方法:
a) 從python中的列表、元組等類型創建ndarray數組
x=numpy.array(list/tuple)
x=numpy.array(list/tuple, dtype=np.int64)
不指定dtype,numpy將根據數據情況關聯一個dtype
b) 使用numpy中函數創建ndarray數組,如:arange,ones,zeros等
函數 |
說明 |
numpy.arange(n) |
類似range()函數,返回ndarray類型,元素從0到n-1 |
numpy.ones(shape) |
根據shape生成一個全一數組,shape是元組類型 |
numpy.zeros(shape) |
根據shape生成一個全零數組,shape是元組類型 |
numpy.full(shape,val) |
根據shape生成一個數組,每個元素值都是val |
numpy.eye(n) |
生成n階單位陣 |
numpy.ones_like(a) |
根據數組a的形狀生成一個全1數組 |
numpy.zeros_like(a) |
根據數組a的形狀生成一個全0數組 |
numpy.full_like(a,val) |
根據數組a的形狀生成一個數組,每個元素值都是val |
numpy.linspace() |
根據起止數據等間距地填充數據,形成數組 |
numpy.concatenate() |
將兩個或多個數組合並成一個新的數組 |
c) 從字節流(raw bytes )中創建ndarray數組
d) 從文件中讀取特定格式,創建ndarray數組
6)ndarray數組的變換
a) ndarray數組的維度變換(例如x=numpy.eye(n))
函數 |
說明 |
x.reshape(shape) |
不改變數組元素,返回一個shape形狀的數組,原數組不變 |
x.resize(shape) |
與.reshape()功能一致,但修改原數組 |
x.swapaxes(ax1,ax2) |
將數組n個維度中的兩個維度進行調換 |
x.flatten() |
對數組進行降維,返回折疊后的一維數組,原數組不變 |
b) ndarray數組的其他變換
函數 |
說明 |
x.astype(new_type) |
類型變換:創建一個新數組(原始數據的一個拷貝)即使兩個數據類型一致 |
x.tolist() |
向列表變換 |
7)ndarray數組的操作:
數組的索引:獲取數組中特定元素。例如
數組的切片:獲取數組元素子集的過程。
a) 一維數組的索引和切片:與python的列表類似
b)多維數組的索引:
每個維度的索引值用逗號分隔,選取一個維度用 :(冒號),每個維度切片方法與一維數組相同。
例如:
8)ndarray數組的運算:
數組與標量之間的運算:
數組與標量之間的運算作用於數組的每一個元素
numpy的一元函數:
函數 |
說明 |
numpy.abs(x)/.fabs(x) |
計算數組中各元素的絕對值 |
numpy.sqrt() |
計算數組中各元素的平方根 |
numpy.square(x) |
計算數組中各元素的平方 |
numpy.log(x)/.log10(x)/log2(x) |
計算數組各元素自然對數、10底對數、2底對數 |
numpy.ceil(x)/.floor(x) |
計算數組各元素的ceilling值或floor的值 |
numpy.rint(x) |
計算數組各元素的四舍五入值 |
numpy.modf(x) |
將數組各元素的小數和整數部分以兩個獨立數組形式返回 |
numpy.cos(x)/.cosh(x) numpy.sin(x)/.sinh(x) numpy.tan(x)/.tanh(x) |
計算數組各元素的普通型和雙曲型三角函數 |
numpy.sign(x) |
計算數組各元素的符號值 |
numpy.exp(x) |
計算數組各元素的指數值 |
numpy的二元函數:
函數 |
說明 |
+ - * / ** |
兩數組各元素進行對應運算 |
numpy.maximum(x)/.fmax(x) numpy.minimum(x)/.fmin() |
元素級的最值 |
numpy.mod(x,y) |
元素級的模運算 |
numpy.copysign(x,y) |
將數組y中各元素的符號賦值給數組x對應元素 |
> < >= == != |
算術比較運算符,產生布爾類型 |
二、numpy庫數據存取與文件
1、 數據的csv文件存取:
a) csv文件:Comma-Separated Value 逗號分隔值。CSV文件是一種常見的文件格式,用於存儲批量數據
b) numpy庫向文件寫入csv格式並從csv文件讀取數據。
i. 向文件寫入csv的函數
numpy.savetxt(frame,array,fmt=’%.18e’, delimiter=None):
功能:該函數可以生成帶有特定分隔字符串的文件。
參數解釋:
frame:文件、字符或生產器,可以是.gz或.bz2的壓縮文件。(即文件路徑)
array:要存入文件的數組。
fmt (format):寫入文件中每一個元素(整型,浮點型等保存在文件中所對應
字符串的格式)使用的格式。例如:%d,%2.f,%.18e。
默認%.18e(科學計數法保留18位小數),這個參數常要修改。
delimiter:分隔字符串,默認是空格。其表示寫入到數據文件中,數據之間
的分隔字符串。CSV文件分隔串為 ‘,’ ,即delimiter=’,’ 。
ii. 讀入csv格式文件的函數
x=numpy.loadtxt(frame,dtype=numpy.float,delimiter=None,unpack=False)
參數解釋:
frame:文件、字符串或產生器,可以是.gz或.bz2的壓縮文件。
dtype:數據類型,可選,將csv文件每個元素字符串變成特定格式。
默認float類型。
unpack:False表示讀入的數據寫入一個數組,True表示讀入屬性將分別寫
入不用變量。
delimiter:分割字符串,默認是任何空格。
c) CSV文件的局限性:CSV文件只能有效存儲一維和二維數組,即上述函數只能有效存取和讀取一維和二維數組。
2、 任意維度數據的存取:
a) 對於ndarray數組a,可以使用a.tofile(frame, sep=’’ , format=‘%s’)
參數解釋:
frame:文件或字符串的名字。
sep:數據分割字符串,如果是空串,寫入文件為二進制(占用空間更少)。
format:寫入數據的格式。例如:%d 。
注意:文件將不會包含維度信息,而是將每個維度元素按列寫入csv文件。
b) 從文件還原數據:
X=numpy.fromfile(frame,dtype=float,count=-1,sep=’’)
參數解釋:
frame:文件、字符串的名字。
dtype:讀取數據的類型。
count:讀入元素個數,默認-1表示讀入整個文件。
sep:表示數據分割字符串,如果是空串,寫入文件為二進制。
注意:讀入后的ndarray數組對象a,通過a.reshape()函數還原維度信息。只有預
先知道文件的維度以及元素類型才能有效還原數據。即a.tofile()與a.fromfile()
需要配合使用。
可以通過元數據文件來存儲額外信息(比較繁瑣)。
c) numpy的便捷文件存取:
i. numpy.save(fname,array)或numpy.savez(fname,array) //存文件
參數解釋:
frame:文件名,已.npy為拓展名,壓縮拓展名為.npz。
array:要存儲的數組變量。
ii. numpy.load(fname) //還原文件
參數解釋:
frame:文件名,以.npy為拓展名,壓縮拓展名為.pyz
三、numpy庫的隨機函數
numpy的random子庫 ( 調用的時候直接numpy.functionName() ):
函數 |
說明 |
第一類 |
|
rand(d0,d1,…,dn) |
根據d0-dn創建隨機數數組,浮點數,[0,1),均勻分布 |
randn(d0,…,dn) |
根據d0-dn創建隨機數數組,標准正態分布 |
randint( low[ , high,shape] ) |
根據shape創建隨機整數或整數數組,范圍是[ low,high ] |
seed(s) |
隨機數種子,s是給定的種子數 |
第二類 |
|
shuffle(a) |
根據數組a的第1軸進行隨機排列,改變原數組a |
permutation(a) |
根據數組a的第1軸產生一個新的亂序數組,不改變原數組a |
choice(a[,size,replace,p] ) |
從一維數組a中以概率p抽取元素,形成size形狀新數組,replace表示每次抽取是否可以重用元素,默認為False |
第三類 |
|
uniform(low,high,size) |
產生具有均勻分布的數組,low是啟始值,high是結束值,size形狀 |
normal(loc,scale,size) |
產生具有正態分布的數組,loc是均值,scale是標准差,size是形狀 |
poisson(lam,size) |
產生具有泊松分布的數組,lam是隨機事件發生概率,size是形狀 |
四、numpy的統計函數
統計函數:統計數組中的信息進行統計運算。
numpy直接提供的統計類函數 通過numpy.functionName()調用:
函數 |
說明 |
sum(a,axis=None) |
根據給定軸axis計算數組a相關元素之和,axis整數或元組 |
mean(a,axis=None) |
根據給定軸axis計算數組a相關元素的期望,axis為整數或元組 |
average(a,axis=None,weights=None) |
根據給定軸axis計算數組a的加權平均值 |
std(a,axis=None) |
根據給定軸axis計算數組a的標准差 |
var(a, axis=None) |
根據給定軸axis計算數組a相關元素方差 |
min(a) max(a) |
計算數組a中元素的最小值、最大值 |
argmin(a) argmax(a) |
計算數組a中元素最小值、最大值的降一維后下標 |
unravel_index(index,shape) |
根據shape將一堆下標index轉換成多維下標 |
ptp(a) |
計算數組a中元素最大值與最小值之差 |
median(a) |
計算數組a中元素的中位數(中值) |
五、梯度函數
梯度:連續值之間的變化率,即斜率。
numpy.random的梯度函數只有一個:
numpy.gradient( f ):計算數組中元素的梯度,當t為多維時,返回每個維度梯度