整體操作numpy數(shù)組的方法
說在前面
?
numpy數(shù)組支持與標(biāo)量的加、減、乘、除和冪等算術(shù)運(yùn)算,計(jì)算結(jié)果為一個(gè)新數(shù)組,其元素為標(biāo)量與原數(shù)組每個(gè)元素進(jìn)行計(jì)算的結(jié)果。演示代碼如下:
2.????? numpy 數(shù)學(xué)函數(shù)和算術(shù)函數(shù)>> a = np.arange(8)>> a.shape = (2, 4) #修改數(shù)組形狀為2行4列>> aarray([[0, 1, 2, 3],[4, 5, 6,7]])>> a + 2array([[2, 3, 4, 5],[6, 7, 8,9]])>> a - 2array([[-2, -1, 0, 1],[ 2, 3, 4, 5]])>> a * 2array([[ 0, 2, 4, 6],[ 8, 10,12, 14]])>> a / 2array([[0. , 0.5, 1. , 1.5],[2. ,2.5, 3. , 3.5]])>> a // 2array([[0, 0, 1, 1],[2, 2, 3,3]], dtype=int32)>> a % 2array([[0, 1, 0, 1],[0, 1, 0,1]], dtype=int32)>> a ** 2 #分別計(jì)算0**2,1**2,2**2,…,7**2array([[ 0, 1, 4, 9],[16, 25,36, 49]], dtype=int32)>> 2 ** a #分別計(jì)算2**0,2**1,2**2,…,2**7array([[ 1, 2, 4, 8],[16, 32, 64, 128]], dtype=int32)
numpy 包含大量的各種數(shù)學(xué)運(yùn)算的函數(shù),包括三角函數(shù),算術(shù)運(yùn)算的函數(shù),復(fù)數(shù)處理函數(shù)等。
numpy 提供了標(biāo)準(zhǔn)的三角函數(shù):sin()、cos()、tan()。arcsin()、arccos()和arctan()函數(shù)返回給定角度的 sin,cos 和 tan 的反三角函數(shù)。這些函數(shù)的結(jié)果可以通過 numpy.degrees() 函數(shù)將弧度轉(zhuǎn)換為角度。
numpy.abs() 函數(shù)返回各元素的絕對(duì)值。
numpy.around() 函數(shù)返回指定數(shù)字的四舍五入值。
numpy.floor()函數(shù)返回小于或者等于指定表達(dá)式的最大整數(shù),即向下取整。
numpy.ceil()函數(shù)返回大于或者等于指定表達(dá)式的最小整數(shù),即向上取整。
numpy.reciprocal()函數(shù)返回各元素的倒數(shù),如1/4 倒數(shù)為 4/1。
3. numpy數(shù)組與數(shù)組的運(yùn)算(1)形狀相同的數(shù)組進(jìn)行算術(shù)運(yùn)算。
可以對(duì)兩個(gè)形狀相同的numpy數(shù)組進(jìn)行算術(shù)運(yùn)算,得到一個(gè)新數(shù)組,其元素的值為原來的兩個(gè)數(shù)組中對(duì)應(yīng)位置上元素進(jìn)行運(yùn)算的結(jié)果。演示代碼如下:
> a =np.array([[1,3,5,7,9],[2,4,6,8,10]])> aarray([[ 1, 3, 5, 7, 9],[ 2, 4, 6, 8,10]])> b = np.array([[1,2,3,4,5],[10,9,8,7,6]])> barray([[ 1, 2, 3, 4, 5],[10, 9, 8, 7, 6]])> a + barray([[ 2, 5, 8,11, 14],[12, 13, 14, 15, 16]])> a - barray([[ 0, 1, 2, 3, 4],[-8, -5, -2, 1, 4]])> a * barray([[ 1, 6, 15, 28, 45],[20, 36, 48, 56, 60]])> a / barray([[1. , 1.5 , 1.66666667, 1.75 , 1.8 ],[0.2 , 0.44444444, 0.75 , 1.14285714, 1.66666667]])> a % barray([[0, 1, 2, 3, 4],[2, 4, 6, 1, 4]], dtype=int32)> a ** barray([[ 1, 9, 125, 2401, 59049],[ 1024, 262144, 1679616, 2097152, 1000000]],dtype=int32)
(2)numpy數(shù)組廣播機(jī)制。
當(dāng)運(yùn)算中的 2個(gè)數(shù)組的形狀不同時(shí),numpy將自動(dòng)觸發(fā)廣播機(jī)制。演示代碼如下:
> a = np.array([[ 0, 0,0],[10,10,10],[20,20,20],[30,30,30]])> b = np.array([1,2,3])> a + barray([[ 1, 2, 3],[11, 12,13],[21, 22,23],[31, 32,33]])
圖1-2展示了數(shù)組b如何通過廣播來與數(shù)組a兼容。

圖1-2
注意:若想要兩個(gè)數(shù)組通過廣播機(jī)制來實(shí)現(xiàn)兼容,則其中某個(gè)數(shù)組的維度必須為1(即只有1行或1列);若條件不滿足,則拋出異常。演示代碼如下:
> a =np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])> b = np.array([[1],[2],[3],[4]])> a + barray([[ 2, 3, 4, 5],[ 7, 8, 9,10],[12, 13,14, 15],[17, 18,19, 20]])> c = np.array([[1, 2],[3, 4]])> a + cTraceback (most recent call last):File"" , line 1, in <module>a + cValueError:?operands?could?not?be?broadcast?togetherwith?shapes?(4,4)?(2,2)
(3)連接數(shù)組。
concatenate()函數(shù)用于沿指定軸連接相同維度的兩個(gè)或多個(gè)數(shù)組,函數(shù)格式如下:
np. concatenate((a1, a2, ...), axis=0)
其中a1, a2, ...表示多個(gè)相同維度的數(shù)組;axis表示沿著它連接數(shù)組的軸,值為0時(shí)增加行數(shù),值為1時(shí)增加列數(shù)。演示代碼如下:
> a = np.array([[1,2],[3,4],[5,6]])> aarray([[1, 2],[3, 4],[5, 6]])> b = np.array([[4, 5],[6,7]])> barray([[4, 5],[6, 7]])> np.concatenate((a,b),axis=0) #沿軸0連接兩個(gè)數(shù)組,要確保列數(shù)相同array([[1, 2],[3, 4],[5, 6],[4, 5],[6, 7]])> c = np.array([[1],[2],[3]])> carray([[1],[2],[3]])> np.concatenate((a,c),axis=1) #沿軸1連接兩個(gè)數(shù)組,要確保行數(shù)相同array([[1, 2, 1],[3, 4,2],[5, 6,3]])
(1)where()函數(shù)
與使用布爾索引訪問數(shù)組類似,numpy模塊提供了where()函數(shù)來返回?cái)?shù)組中滿足條件的索引數(shù)組,或根據(jù)數(shù)組中的元素是否滿足指定條件來決定取值x還是y,其語法格式如下:
numpy.where(condition[,x,y])
該函數(shù)有一個(gè)必選參數(shù)condition,通過判斷原數(shù)組的每個(gè)元素是否滿足條件,返回一個(gè)由滿足條件的元素的索引構(gòu)成的數(shù)組;x,y是可選參數(shù),如果條件為真,則返回x,否則返回y。
如果只有一個(gè)condition參數(shù),則該函數(shù)返回索引數(shù)組,或者是由索引數(shù)組構(gòu)成的元組(多維數(shù)組);如果是有三個(gè)參數(shù),則返回由x和y值構(gòu)成的數(shù)組。演示代碼如下:
>> a = np.arange(1, 11)>> aarray([ 1, 2, 3, 4, 5, 6, 7, 8, 9,10])>> np.where(a % 2 == 1) #提供1個(gè)參數(shù),只返回滿足條件的索引數(shù)組(array([0, 2, 4, 6, 8], dtype=int64),)>> a[np.where(a % 2 ==1)] #使用索引重構(gòu)原數(shù)組array([1, 3, 5, 7, 9])>> np.where(a % 2 == 1, 1,0) #提供3個(gè)參數(shù),滿足條件取值1,否則取值0array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0])>>a=np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]]) #二維數(shù)組>> aarray([[1, 2, 3, 4,5],[2, 3, 4, 5, 6],[3, 4, 5, 6, 7],[4, 5, 6, 7, 8]])>> i =np.where((a>4) & (a<7)) #提供1個(gè)參數(shù),只返回滿足條件的索引數(shù)組>> i #因?yàn)閍是二維數(shù)組,故i為由索引數(shù)組構(gòu)成的元組,分別存儲(chǔ)了滿足條件的數(shù)組元素的行索引和列索引(array([0, 1, 1, 2,2, 3, 3], dtype=int64), array([4, 3, 4, 2, 3, 1, 2], dtype=int64))>> a[i] #使用索引重構(gòu)原數(shù)組,相當(dāng)于使用整數(shù)數(shù)組索引訪問數(shù)組array([5, 5, 6, 5,6, 5, 6])>> a[[0,1, 1, 2, 2, 3, 3],[4, 3, 4, 2, 3, 1, 2]] #使用整數(shù)數(shù)組索引訪問數(shù)組array([5, 5, 6, 5,6, 5, 6])>> np.where(a % 2 == 1, 1, 0)#提供3個(gè)參數(shù),滿足條件取值1,否則取值0array([[1, 0, 1, 0, 1],[0, 1, 0, 1, 0],[1, 0, 1, 0, 1],[0, 1, 0, 1, 0]])>> np.where(a % 2 == 1, a*2, a//2) #提供3個(gè)參數(shù),奇數(shù)翻倍,偶數(shù)減半array([[ 2, 1, 6, 2, 10],[ 1, 6, 2,10, 3],[ 6, 2, 10, 3, 14],[ 2,10, 3, 14, 4]])
(2)piecewise()函數(shù)
piecewise()函數(shù)用來篩選滿足不同條件的元素,函數(shù)格式如下:
np.piecewise(x, condlist, funclist,*args, **kw)
關(guān)鍵參數(shù)說明:
x表示要進(jìn)行操作的對(duì)象;condlist表示要滿足的條件列表,可以是多個(gè)條件構(gòu)成的列表;funclist是執(zhí)行的操作列表,它與參數(shù)condlist是對(duì)應(yīng)的,當(dāng)條件為True時(shí),則執(zhí)行相對(duì)應(yīng)的操作函數(shù)。返回一個(gè)array對(duì)象,和原始操作對(duì)象x具有完全相同的維度和形狀。
例如,隨機(jī)生成一個(gè)numpy數(shù)組a存儲(chǔ)學(xué)生成績(jī),為學(xué)生設(shè)置1、2、3、4四個(gè)等級(jí);臨界分?jǐn)?shù)分別為60、80和90分。演示代碼如下:
a = np.random.randint(0, 101, 6)print(a)b = np.piecewise(a,[a<60,((60<=a)&(a<80)),((80<=a)&(a<90)),a>=90],[1, 2,3, 4])print(b)
(1)隨機(jī)生成一個(gè)二維numpy數(shù)組a,將數(shù)組中小于0的置零大于零的保留原值。
參考代碼如下:
a = np.random.randint(-10, 10, (2, 3)) #生成2行3列元素值介于[-10,10)的隨機(jī)整數(shù)print(a)#方法一:where()函數(shù)b = np.where(a>0, a, 0)print(b)#方法二:abs()函數(shù)b = (a + np.abs(a)) // 2print(b)#方法三:布爾索引a[a<0] = 0print(a)
(2)隨機(jī)生成一個(gè)二維numpy數(shù)組a,對(duì)數(shù)組元素做y=2*x*x-3*x+5的運(yùn)算(連續(xù)函數(shù))。
參考代碼如下:
a = np.random.randint(-10, 10, (2, 3)) #生成2行3列元素值介于[-10,10)的隨機(jī)整數(shù)print(a)def fun(x): #連續(xù)函數(shù)return2*x*x-3*x+5b = fun(a)print(b)
(3)隨機(jī)生成一個(gè)二維numpy數(shù)組a,對(duì)數(shù)組元素做y=4*x-3(x>0),y=2*x+6(x<=0)的運(yùn)算(非連續(xù)函數(shù))。
參考代碼如下:
a = np.random.randint(-10, 10, (2, 3)) #生成2行3列元素值介于[-10,10)的隨機(jī)整數(shù)print(a)def fun2(x): #非連續(xù)函數(shù)if x > 0:y =4*x-3else:y = 2*x+6return yfun_vec = np.vectorize(fun2) #先對(duì)fun2進(jìn)行向量化處理b = fun_vec(a) #再調(diào)用向量化處理過的函數(shù)print(b)
(4)從存儲(chǔ)身份證號(hào)碼的數(shù)組中提取出生日期信息。
參考代碼如下:
a = ["330281200409172215","522424200405202975","610528200409070018"]a = np.array(a)def fun3(x): #非連續(xù)函數(shù)returnx[6:14]fun_vec = np.vectorize(fun3) #先對(duì)fun3進(jìn)行向量化處理b = fun_vec(a) #再調(diào)用向量化處理過的函數(shù)print(b)
(5)隨機(jī)生成一個(gè)numpy數(shù)組a,返回其對(duì)應(yīng)的二進(jìn)制數(shù)(非連續(xù)函數(shù))。
參考代碼如下:
a = np.random.randint(-10, 10, 3)print(a)def fun4(x): #非連續(xù)函數(shù)returnbin(x)fun_vec = np.vectorize(fun4) #先對(duì)fun4進(jìn)行向量化處理b = fun_vec(a) #再調(diào)用向量化處理過的函數(shù)print(b)
(6)隨機(jī)生成2個(gè)numpy數(shù)組a和b,若a>b,返回a-b;否則返回b-a(非連續(xù)函數(shù))。
參考代碼如下:
a = np.random.randint(-10, 10, 3)b = np.random.randint(-10, 10, 3)print(a, b)def fun5(a, b): #非連續(xù)函數(shù)if a > b:return a- belse:return b- afun_vec = np.vectorize(fun5) #先對(duì)fun5進(jìn)行向量化處理c = fun_vec(a, b) #再調(diào)用向量化處理過的函數(shù)print(c)
知識(shí)小貼士
vectorize()函數(shù)用來將函數(shù)向量化處理,以便可以批量處理numpy數(shù)組的每一個(gè)元素,其具體參數(shù)如下:
numpy.vectorize(pyfunc, otypes=None, doc=None,excluded=None, cache=False, signature=None)
pyfunc : python函數(shù)或方法。
otypes : 輸出數(shù)據(jù)類型。必須將其指定為一個(gè)typecode字符串或一個(gè)數(shù)據(jù)類型說明符列表。每個(gè)輸出應(yīng)該有一個(gè)數(shù)據(jù)類型說明符。
doc : 函數(shù)的docstring。如果為None,則docstring將是pyfunc.__doc__。
excluded : 表示函數(shù)不會(huì)向量化的位置或關(guān)鍵字參數(shù)的字符串或整數(shù)集。這些將直接傳遞給未經(jīng)修改的pyfunc。
cache :如果為True,則緩存第一個(gè)函數(shù)調(diào)用,該函數(shù)調(diào)用確定未提供otype的輸出數(shù)。
signature : 廣義通用函數(shù)簽名,例如,(m,n),(n)->(m)用于矢量化矩陣 - 向量乘法。如果提供的話,pyfunc將調(diào)用(并期望返回)具有由相應(yīng)核心維度的大小給出的形狀的數(shù)組。默認(rèn)情況下,pyfunc假定將標(biāo)量作為輸入和輸出。
函數(shù)返回值:向量化的數(shù)組。
需要本文源代碼和word文稿的,可以加入“Python算法之旅”知識(shí)星球參與討論和下載文件,“Python算法之旅”知識(shí)星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注Python算法,感興趣就一起來!
相關(guān)優(yōu)秀文章:
