python之numpy的簡單使用
阿新 • • 發佈:2018-11-13
import numpy as np '''生成0-1之間符合條件的陣列''' #生成一個隨機浮點數 a1 = np.random.rand() # print(a1) #生成一個二維陣列 a2 = np.random.rand(3,4) # print(a2) '''檢視陣列的維度、大小、資料型別''' # print('陣列的維度:',a2.ndim) # print('陣列的大小:',a2.shape) # print('陣列的資料型別:',a2.dtype) '''生成指定元素區間的陣列,並且可以指定大小''' #前兩個引數代表資料的區間,第三個引數為陣列大小shape a3 = np.random.uniform(2,3,(2,5)) # print(a3) #生成隨機整型陣列 a4 = np.random.randint(2,size=5) # print(a4) a5 = np.random.randint(2,size=(2,4)) # print(a5) '''序列建立''' a6 = np.array([2,4,5,3]) # print(a6) a7 = np.array([[3,4],[7,2]],dtype='int32') # print(a7) '''建立全是0的額陣列,但是shape必須指定,元組型別,如果是一個整型數字,代表是一個一維陣列''' #如果不指定型別,預設使用numpy.float64 a8 = np.zeros((4,4),dtype='int8') # print(a8) a9 = np.zeros((4,4)) # print(a9) a10 = np.ones((4,4),dtype='int8') # print(a10) a11 = np.ones((4,4)) # print(a11) '''按照範圍,順序生成''' # arange (start, stop, step,dtype) # np.arange(1,100,10) == np.array(range(1,100,10)) a12 = np.arange(1,100,10) # print(a12) a13 = np.array(range(1,100,10)) # print(a13) '''重新調整維度''' '''方法一''' a14 = np.zeros((3,4)) # print(a14) a15 = a14.reshape((2,2,3)) # print(a15) # print(a15.ndim) # print(a15.shape) a16 = a14.reshape((2,6)) # print(a16) '''方法二''' # print(a16.T) '''打亂順序''' a17 = np.arange(1,100,10) a18 = np.random.shuffle(a17) # print(a17) # print(a18) #舒服之後,原來的資料做了打亂處理,慎重,在原有陣列基礎上 '''numpy的資料型別''' ''' 名稱 描述 bool_ 布林型資料型別(True 或者 False) int_ 預設的整數型別(類似於 C 語言中的 long,int32 或 int64) intc 與 C 的 int 型別一樣,一般是 int32 或 int 64 intp 用於索引的整數型別(類似於 C 的 ssize_t,一般情況下仍然是 int32 或 int64) int8 位元組(-128 to 127) int16 整數(-32768 to 32767) int32 整數(-2147483648 to 2147483647) int64 整數(-9223372036854775808 to 9223372036854775807) uint8 無符號整數(0 to 255) uint16 無符號整數(0 to 65535) uint32 無符號整數(0 to 4294967295) uint64 無符號整數(0 to 18446744073709551615) float_ float64 型別的簡寫 float16 半精度浮點數,包括:1 個符號位,5 個指數位,10 個尾數位 float32 單精度浮點數,包括:1 個符號位,8 個指數位,23 個尾數位 float64 雙精度浮點數,包括:1 個符號位,11 個指數位,52 個尾數位 complex_ complex128 型別的簡寫,即 128 位複數 complex64 複數,表示雙 32 位浮點數(實數部分和虛數部分) complex128 複數,表示雙 64 位浮點數(實數部分和虛數部分) ''' '''astype更改資料型別,如果沒有設定copy,返回值為一個新的陣列''' a19 = np.random.randint(1,12,(1,2),dtype='uint8') # print(a19) # print(a19.dtype) a20 = a19.astype(np.float64) # print(a20) # print(a20.dtype) '''陣列運算''' a21 = [[1,2,3,4],[1,2,3,4]] a22 = [[5,2,3,4],[5,2,3,4]] #列表相加 # print(a21+a22) s1 = np.array(a21) s2 = np.array(a22) #陣列乘以一個常數 s3 = s1*10 # print(s3) #多維陣列和多維陣列相乘 # print(s1*s2) #陣列加法 # print(s1+s2) ''' 一維陣列與一維陣列:保證元素的個數必須相同 多維陣列與多維陣列:注意形狀,相同的維度大小和維度個數 一維陣列與多維陣列:注意一維陣列的形狀問題 ''' '''一維陣列的切片和索引''' s4 = np.array([1,2,3]) # 索引類似列表,下標從0 開始 # print(s4[2]) #全部擷取 # print(s4[:]) #從2位開始,擷取到最後 # print(s4[1:]) #從開始擷取到最後,步長為2 # print(s4[::2]) '''多維陣列的切片和取值''' s5 = np.array([[1,2,3],[4,5,6],[7,8,9]]) # print(s5) #取單值 #按照列表思想取值 # print(s5[1][1]) #按照陣列思維取值 # print(s5[1,1]) #取多值 #以,為界,前面的是列標,後面的是行標,注意,索引以0開始,並且類似左閉又開 # print(s5[0:2,1:3]) #擷取所有一維陣列的第2、3個 # print(s5[:,1:3]) #擷取不連續的多行多列 # print(s5[::2,1:]) '''numpy 的計算函式''' #向上取整數,並保持資料型別不改變 s6 = np.random.uniform(-5,10,(3,4)) s7 = np.ceil(s6) # print(s6) # print(s7) #向下取整 np.floor() #四捨五入 np.rint() #平方 np.square() #平方根 np.sqrt() '''將陣列分為兩個部分,一個是小數部分,一個是整數部分''' # print(s6) # print(np.modf(s6)[0]) # print(np.modf(s6)[1]) '''判斷是否為空值,判斷每一個元素''' s8 = np.isnan(s6) # print(s8) '''條件篩選''' s9 = np.array([ 0, -1, 2, -1, 4,-1, 6, -1, 8, -1]).reshape((2,5)) # print(s9) #where的用法:迭代判斷陣列的每一個元素是否符合條件判斷,如果符合,返回該元素,不符合,則返回預設值 s10 = np.where((s9%2==0),s9,9) # print(s10) '''zip的用法''' #2 zip(o1,o2)把對應位置上的兩個物件壓縮成一個元組 # 將陣列轉列表:s2.tolist() s11 = np.array([1,3,2,4,9,8,7,-1,-2,-2]).reshape((2,5)) # print(s11) s12 = np.array([1,2,-7,8,9,4,7,-1,3,-2]).reshape((2,5)) # print(s12) #where s13 = np.where(s11>s12,s11,s12) # print(s13) #zip s11_list = s11.reshape(10,).tolist() # print(s11_list) s12_list = s12.reshape(10,).tolist() # print(s12_list) list3 = [x if x>y else y for x,y in zip(s11_list,s12_list)] # print(list3) # print(np.array(list3).reshape((2,5))) '''使用uniform,生成10,40之間的陣列,組成(3,4)陣列,找出所有四捨五入之後,大於20 ,並且小於30的數字,修改成50,其他數字不變,組成新的陣列''' #(1) s17 = np.random.uniform(10,40,(3,4)).round() # print(s17) s14 = np.where((s17>20)&(s17<30),50,s17) # print(s14) #(2) s15 = np.random.uniform(10,40,(3,4)) # print(s15) s16 = np.where((np.rint(s15)>20)&(np.rint(s15)<30),50,np.rint(s15)) # print(s16) '''numpy的常用函式''' ''' #裡面可以新增引數axis選擇行列的資料 求和: np.sum 求平均:np.mean 求最大值:np.max 求最小值:np.min 求方差:np.var 求標準差: np.std 求最大值的下標:np.argmax ''' '''元素判斷''' s20 = np.array([1,2,-7,8,9,4,7,-1,3,-2]).reshape((2,5)) # print(s20) #如果可迭代物件中有一個符合條件就輸出True # print(np.any(s20<5,axis=0)) #如果可迭代物件中全部符合條件就輸出True # print(np.all(s20<5,axis=0)) '''陣列的操作''' # 追加一個元素,會對多維陣列進行降維操作 # 一維陣列追加單個元素,列表或者陣列,返回的也是一維陣列 # 多維陣列也是一樣返回一維陣列 d1 = np.arange(10,20) d2 = d1.reshape((2,5)) # print(d1) # print(d2) #追加元素 ,如果是一維陣列,不需要呼叫到axis這個引數 d3 = np.append(d1,20) # print(d3) # 多維陣列的追加,降維成一維陣列,將元素追加到末尾 d4 = np.append(d2,20) # print(d4) # 一維陣列追加列表 d5 = np.append(d1,[20,21]) # print(d5) # 一維陣列和多維陣列相追加,降維,加入到末尾 d6 = np.append(d2,d1) d7 = np.append(d1,d2) # print(d6) # print(d7) #insert的運用 d8 = np.insert(d1,0,100) # print(d8) d9 = np.insert(d1,0,100,axis=0) # print(d9) d10 = np.insert(d2,0,100) # print(d10) d11 = np.insert(d2,0,100,axis=0) # print(d11) #delete函式的使用問題 #一維陣列 d12 = np.delete(d1,0,axis=0) # print(d12) d13 = np.delete(d1,[0,1],axis=0) # print(d13) #多維陣列 d12 = np.delete(d2,0,axis=1) # print(d12) d13 = np.delete(d2,[0,1],axis=1) # print(d13) '''數組合並''' f1 = np.arange(10,20) f2 = np.arange(30,40) # 二維陣列 f3 = f1.reshape((2,5)) f4 = f2.reshape((2,5)) # print(f1) # print(f2) # print(f3) # print(f4) f5 = np.concatenate((f1,f2)) # print(f5) f6 = np.concatenate((f3,f4)) # print(f6) '''集合的問題''' list01 = [1,1,1,1,2,3,4,5,12,12,13,7,8,9,9,9] # print(list01) # print(len(list01)) q1 = np.array(list01) #一維陣列去重 q2 = np.unique(q1) # print(q2) #多維陣列去重,降維成一位陣列去重 #求並集的情況 # 一維陣列的並集,去重並且排序 # 多維陣列求並集降維,去重並且排序 # np.union1d() #求交集的情況 # np.intersect1d()