Numpy的組成與功能
Numpy(Numeric Python)可以被理解為一個用python實現的科學計算包,包括:
????????? 1.強大的N維數組對象Array;
?????????? 2.成熟的函數庫;
?????????? 3.實用的線性代數、傅里葉變換和隨機數生成函數。
?????????? 線性代數是數學的一個分支,它的研究對象是向量,向量空間(或稱線性空間),線性變換和有限維的線性方程組。
?????????? 傅立葉變換,表示能將滿足一定條件的某個函數表示成三角函數(正弦和/或余弦函數)或者它們的積分的線性組合。
提供了許多高級的數值編程工具,如矩陣數據類、矢量處理,以及精密的運算庫。
為什么要使用數組對象?
1.數組對象可以去掉元素間運算所需的循環,使一維向量更像單個數據
2.設置專門的數組對象,經過優化,可以提升這類應用的運算速度
???? 觀察:科學計算中,一個維度所有數據的類型往往相同
3.數組對象采用相同的數據類型,有助于節省運算和存儲空間
例:計算a2+b3,其中,a和b是一維數組
基礎知識
維度(dimensions)叫做軸(axes 原型:axis)
軸的個數叫做秩(rank)
例如,在3D空間一個點的坐標[1,2,3]是一個秩為1的數據,因為它只有一個軸。軸長度為3.
例如,在[[1.,0.,0.],[0.,1.,2.]]這個例子中,數組的秩為2(它有兩個維度)。第一個維度長度為2,第二個維度長度為3.
Numpy的數組類被稱作ndarray,通常被稱作數組。
ndarray是一個多位數組對象,有兩部分構成:
?????????? 實際的數據
??????????? 描述這些數據的元數據(數據維度、數據類型)
ndarray數組一般要求所有原屬類型相同(同質),數組下標從0開始
注意:numpy.array和標準python庫類array.array并不相同,后者只處理一維數組和提供少量功能。
ndarray對象屬性主要見下表:例如其中.shape表示數組的維度,.size表示數組元素的個數。
ndarray.ndim? 秩,即軸的數量或維度的數量
ndarray.shape? 數組的維度,這是一個指示數組在每個維度上大小的整數元祖。(ndarray對象的尺度,對于矩陣,n行m列)
ndarray.size?? 數組元素的總個數,等于shape屬性中元組元素的乘積。(ndarray對象的個數,相當于.shape中n*m的值)
ndarray.itemsize? 數組中每個元素字節的大小。
ndarray.dtype?? 一個用來描述數組中元組類型的對象,可以通過使用標準python類型創造dtype.
ndarray.data????? 包含實際數組元素的緩沖區,通常我們通過索引引用數組元素,不使用這個屬性
ndarray的元素類型
bool??????? 布爾類型,true或false
intc???????? 與c語言中的int類型一致,一般是int32或int64
intp????????? 用于索引的整數,與c語言中ssize_t一致,int32或int64
int8????????? 字節長度的整數,取值:[-128,127]
int16? ? ? ? 16位長度的整數,取值:[-32768,32768]
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位浮點數
?????????????????????? 實部(.real)+j虛部(.imag)
ndarray為什么要支持這么多種元素類型?
對比:python語法僅支持整數、浮點數和復數3種類型
1.科學計算設計數據較多,對存儲和性能都有較高要求
2.對元素類型精細定義,有助于numpy合理使用儲存空間并優化性能
3.對元素類型精細定義,有助于程序員對程序規模有合理評估
ndarray數組可以由非同質對象構成 np.array([0,1,2,3,4],[9,8,7,6])
非同質ndarray元素為對象類型? dtype = object
非同質ndarray對象無法有效發揮numpy優勢,盡量避免使用
創建數組(方法一)
創建數組的方法有多種,比如可以使用array函數利用常規的python列表和元組創造數組。所創建的數組類型由原序列中的元素類型決定。
x= np.array(list/tuple,dtype=np.float32)
示例如下:
創建數組(方法二)
numpy提供了一些使用占位符創建數組的函數
例如:
函數zeros(shape)創建一個全是0的數組,
函數ones(shape)創建一個全1的數組,
函數empty創建一個內容隨機并且依賴與內存狀態的數組
函數full(shape,val) 根據shape生成一個數組,每個元素值都是val
函數eye(n)創建一個正方的n*n的單位矩陣,對角線為1,其余都是0
默認創建的數組類型(dtype)都是float64.示例如下:
zeros((3,4))
ones((2,3,4),dtype = int16)
#2個維度,每個維對里有3個數組,每個數組里4個元素
empty((2,3))
np.eye(5)
創建數組(方法三)
此外numpy提供一個arange的函數返回數組,示例如下:
arange(10,30,5)
arange(0,2,0.3)
其他創建方法
np.ones_like(a)???? 根據數組a的形狀生成一個全1數組
np.zeros_like(a)? ? 根據數組a的形狀生成一個全0數組
np.full_like(a,val)? ? 根據數組a的形狀生成一個數組,每個元素值都是val
np.linspace()? ? 根據起止數據等間距地填充數據,形成數據
np.concatenate()? 將兩個或多個數組合成一個新的數組
打印數組
打印數組時,numpy以類似嵌套列表的形式顯示
?示例如下:其中一維數組被打印成行,二維數組成矩陣,三維數組成矩陣列表
ndarray數組的變換
對于創建后的ndarray數組,可以對其進行緯度變換和元素類型變換
a = np.ones((2,3,4),dtype = np.int32)
.reshape(shape)???? 不改變數組元素,返回一個shape形態的數組,原數組不變
.resize(shape)??????? 與.reshape()功能一致,但修改原數組
.swapaxes(ax1,ax2)??? 將數組n個維度中兩個維度進行調換
.flatten()????????????????? 對數組進行降維,返回折疊后的一堆數組,原數組不變
ndarray數組的維度變換
基本運算
數組的算術運算是按元素進行。
???????? numpy中的乘法運算符*指示按元素計算
矩陣乘法可以使用dot函數或創建矩陣對象實現。
numpy一元函數
對ndarray中的數據執行元素級運算的函數
np.abs(x)? np.fabs(x)? 計算數組各元素的絕對值
np.sqrt(x)?? 計算數組各元素的平方根
np.square(x)? 計算數組各元素的平方
np.log(x)?? np.log10(x)? np.log2(x)?? 計算數組各元素的自然對數、10底對數和2底對數
np.ceil(x)?? np.floor(x)?? 計算數組各元素的ceiling值或floor值
np.rint(x)?? 計算數組各元素的四舍五入值
np.modf(x)?? 將數組各元素的小數和整數部分以兩個獨立數組形式返回
np.cos(x)? np.cosh(x) np.sin(x)? np.sinh(x)? np.tan(x)? np.tanh(x)? 計算數組各元素的普通型和雙曲型三角函數
np.exp(x)?? 計算數組各元素的指數值
np.sign(x)?? 計算數組各元素的符號值,1(+),0,-1(-)
+ 1 * / **???? 兩個數組各元素進行對應運算
np.maxinum(x,y)? np.fmax()? np.minimum(x,y)? np.fmin()? 元素級的最大值/最小值計算
np.mod(x.y)??? 元素級的模運算
np.copysign(x,y)?? 將數組y中各元素值的符號賦值給數組x對應元素
>? <? >=? <= == !=?? 計算比較,產生布爾型數組
?? ? ? ? ? 示例如下:
a=array([20,30,40,50])
b=arange(4)
打印b? array=([0,1,2,3])
c =a-b
打印 c? array=([20,29,38,47])
b**2
打印得 array([0,1,4,9])
10*sin(a)
打印得 array([9.12945251,-9.88031624,7.4511316,-2.62374854])
a<35
打印得 array([True,True,False,False],dtype = bool)
非數組的運算可以利用ndarray類方法實現
通用函數(ufunc)--Nunpy提供常見的數學函數
如sin,cos和exp
在numpy里這些函數作用桉數組的元素運算,產生一個數組作為輸出。示例如下:
a =random.random((2,3))
打印結果:array([[0.52732678,0.92066148,0.25701814],[0.66596685,0.24443251,0.39027655]])
a.sum()
打印結果:3.0056823003535524
a.min()
打印結果:0.224443250574359088
a.max()
打印結果:0.92066148305911222
b = arange(12).reshape(3,4)
打印結果:array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
b.sum(axis=0)
打印結果:array([12,15,18,21])
b.min(axis = 1)
打印結果:array([0,4,8])
b.cumsum(axis = 1)
打印結果:array([[0,1,3,6],[4,9,15,22],[8,17,27,38]],dtype=int32)
索引、切片與迭代
索引:獲取數組中特定位置元素的過程
切片:獲取數組元素子集的過程
數組還可以被索引、切片和迭代,示例如下:
a =arange(10)**3
打印結果:array([0,1,8,27,64,125,216,343,512,729],dtype=int32)
a[2]
打印結果:8
a[2:5]
打印結果:array([8,27,64],dtype=int32)
a[:6:2] = -1000
打印結果:array([-1000,1,-1000,27,-1000,125,216,343,512,729],dtype=int32)
a[::-1]
打印結果:array([729.512,343,216,125,-1000,27,-1000,1,-1000],dtype = int32)
矩陣運算
Numpy對于多維數組的運算,缺省情況下并不適用矩陣運算,對數組進行矩陣運算,可調用相應的函數。
numpy庫也提供了matrix類,使用matrix類創建的是矩陣對象,他們的加減乘除運算缺省采用矩陣方式計算,用法和matlab十分類似。
矩陣中更高級的一些運算可以在numpy的線性代數子庫linalg中找到。例如inv函數計算逆矩陣,solve函數可以求解多元一次方程組。
數據的csv文件存取
csv(comma-separated value,逗號分隔值)
產生是一種常見的文件格式,用來存儲批量數據
np.savetxt(frame,array,fmt='%.18e',delimiter=None)
frame:文件、字符串或產生器,可以是.gz或.bz2的壓縮文件
array:存入文件的數組
fmt:寫入文件的格式,例如:%d?? %.2f? %.18e
delimiter:分割字符串,默認是任何格式
np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False)
frame:文件、字符串或產生器,可以是.gz或.bz2的壓縮文件
dtype:數據類型,可選
delimiter:分割字符串,默認是任何空格
unpack:如果true,讀入屬性將分別寫入不同變量
csv只能有效存儲一維和二維數組
np.savetxt()? np.loadtxt()只能有效存取一維和二維數組
多維數組的存取
a.tofile(frame,sep='',format='%s')
frame:文件、字符串
sep:數據分割字符串,如果是空串,寫入文件為二進制
format:寫入數據的格式
np.fromfile(frame,dtype = float,count = -1,sep='')
frame:文件、字符串
dtype:讀取的數據類型
count:讀入元素個數,-1表示讀入整個文件
sep:數據分割字符串,如果是空串,寫入文件為二進制
需要注意
改方法需要讀取時知道存入文件時數組的維度和元素類型
a.tofile()和np.fromfile()需要配合使用
可以通過元數據文件來存儲額外信息
numpy的便捷文件存取
np.save(fname,array) 或 np.savez(fname,array)
fname:文件名,以.npy為擴展名,壓縮擴展名為.npz
array:數組變量
np.load(fname)
fname:文件名,以.npy為擴展名,壓縮擴展名為.npz
numpy的隨機函數子庫?
numpy的rando子庫?? np.random.*
np.random.rand()????? np.random.randn()???? np.random.randint()
rand(d0,d1...,dn)???? 根據d0-dn創建隨機數數組,浮點數,[0,1],均勻分布
randn(d0,d1...,dn)? ? 根據d0-dn創建隨機數數組,標準正態分布
randint(low[,high,shape])?? 根據shape創建隨機整數或整數數組,范圍是[low,high]
seed(s)?????? 隨機數種子,s是給定的種子值
? ? ??????????????? 給隨機數對象一個種子值,用于產生隨機序列。
??????????????????? 對于同一個種子值的輸入,之后產生的隨機數序列也一樣。
???????????????????? 通常是把時間秒數等變化值作為種子值,達到每次運行產生的隨機系列都不一樣
???????????????????? seed() 省略參數,意味著使用當前系統時間生成隨機數
shuffle(a)?????????????? 根據數組a的第1軸進行隨排列,改變數組x
permutation(a)??????? 根據數組a的第一軸產生一個新的亂序數組,不改變數組x
choice(a[,size,replace,p])??? 從一維數組a中以概率抽取元素,形成size形狀新數組replace表示是否可以重用元素,默認為false
uniform(low,high,size)? 產生具有均勻分布的數組,low起始值,high結束值,size形狀
normal(loc,scale,size)?? 產生具有正態分布的數組,loc均值,scale標準差,size形狀
poisson(lam,size)???????????? 產生具有泊松分布的數組,lam隨機事件發生率,size形狀
numpy的統計函數
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的梯度函數
np.gradient(f)?????? 計算數組f中元素的梯度,當f為多維時,返回每個維度梯度
梯度:連續值之間的變化率,即斜率
xy坐標軸連續三個x坐標對應的y軸值:a,b,c,其中,b的梯度是:(c-a)/2