python科學計算之Numpy

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容