NumPy(Numerical Python) 是 Python 語言的一個擴展程式庫,支持大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫,NumPy 是一個運行速度非常快的數學庫,主要用于陣列計算,包含:一個強大的N維陣列物件 ndarray;廣播功能函式;整合 C/C++/Fortran 代碼的工具;線性代數、傅里葉變換、亂數生成等功能等,
NumPy 通常與 SciPy(Scientific Python)和 Matplotlib(繪圖庫)一起使用, 這種組合廣泛用于替代 MatLab,是一個強大的科學計算環境,有助于我們通過 Python 學習資料科學或者機器學習,SciPy 是一個開源的 Python 演算法庫和數學工具包,SciPy 包含的模塊有最優化、線性代數、積分、插值、特殊函式、快速傅里葉變換、信號處理和影像處理、常微分方程求解和其他科學與工程中常用的計算,
Matplotlib 是 Python 編程語言及其數值數學擴展包 NumPy 的可視化操作界面,它為利用通用的圖形用戶界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向應用程式嵌入式繪圖提供了應用程式介面(API),
numeric python 數字化的python()
numpy中最重要的一個形式叫ndarray:n dimension array 工程數學(線性代數)?,零維度:標量 1;一維:向量 [1,2,3,4,5,6];二維:矩陣 A=[[1,2,3],[1,2,3]] A.shape(2x3);三維及以上:張量 ,Python 本身支持的數值型別有 int(整型,python2 中存在 long 長整型)、float(浮點型)、bool(布爾型) 和 complex(復數型),?而 Numpy 支持比 Python 本身更為豐富的數值型別,細分如下:?
1 ''' 2 1. bool:布爾型別,1 個位元組,值為 True 或 False, 3 2. int:整數型別,通常為 int64 或 int32 , 4 3. intc:與 C 里的 int 相同,通常為 int32 或 int64, 5 4. intp:用于索引,通常為 int32 或 int64, 6 5. int8:位元組(從 -128 到 127) tinyint(tinyint 1位元組 -2 ^7 ~ 2^7-1 (-128~127)) 7 6. int16:整數(從 -32768 到 32767) smallint(smallint 2位元組 -2 ^15 ~ 2^15-1 (-32768~32765)) 8 7. int32:整數(從 -2147483648 到 2147483647) int(int 4位元組 -2 ^31~ 2^31-1 (-2147483648~2147483647)) 9 8. int64:整數(從 -9223372036854775808 到 9223372036854775807) bigint(bigint 8位元組 -2 ^63 ~ 2^63-1) 10 9. uint8:無符號整數(從 0 到 255) unsigned 11 10. uint16:無符號整數(從 0 到 65535) 12 11. uint32:無符號整數(從 0 到 4294967295) 13 12. uint64:無符號整數(從 0 到 18446744073709551615) 14 13. float:float64 的簡寫, 15 14. float16:半精度浮點,5 位指數,10 位尾數 16 15. float32:單精度浮點,8 位指數,23 位尾數 17 16. float64:雙精度浮點,11 位指數,52 位尾數 18 17. complex:complex128 的簡寫, 19 18. complex64:復數,由兩個 32 位浮點表示, 20 19. complex128:復數,由兩個 64 位浮點表示, 21 '''
在 Numpy 中,上面提到的這些數值型別都被歸于 dtype(data-type資料型別) 物件的實體,?我們可以用 numpy.dtype(object, align, copy) 來指定數值型別,而在陣列里面,可以用 dtype= 引數,
numpy創建陣列:
1). np.ndarray(shape [, dtype] ):隨機生成一個ndarray,
2). np.array(object [, dtype=None, copy=True, order=None, subok=False, ndmin=0] ):將串列或元組轉換為ndarray陣列;object:表示串列或元組等,dtype:資料型別(如未給出,則型別為被保存物件所需的最小型別),copy:布爾來寫,默認 True,表復制物件,
3). np.arange(start, stop [, step, dtype=None] ):生成一個有規律增長的一維陣列,在給定區間內創建一系列均勻間隔的值,[開始,停止)半開半閉區間,step:步長用于設定值之間的間隔,dtype可以設定回傳ndarray 的值型別,
4). np.linsapce(start, stop [, num=50, endpoint=True, retstep=False, dtype=None] ):生成一個有規律增長的一維陣列,和arange方法很像,在指定的區間內回傳間隔均勻的值,全閉區間,start:序列的起始值; stop:序列的結束值;num:生成的樣本數,默認值為50;endpoint:布林值,如果為真,則最后一個樣本包含在序列內;retstep:布林值,如果為真,回傳間距;dtype:陣列的型別,
5). np.ones(shape[, dtype=None, order='C']):生成一個元素全部都為1的陣列;shape:用于指定陣列形狀,例如(1,2)或 3, dtype:資料型別, order:{'C','F'},按行或列方式儲存陣列,
6). np.zeros(shape, dtype=None, order='C'):生成一個元素全部為0的陣列 ,zeros 方法和 ones 方法非常相似,
7). np.full(shape,fill_value=https://www.cnblogs.com/bonheur/p/num):自定義填充值的陣列;用于創建一個自定義形狀的陣列,可以自己指定一個值,該值填滿整個矩陣 ,
8). np.eye(N, M=None, k=0, dtype=<type 'float'>):生成一個單位矩陣,創建一個二維陣列,N:輸出陣列的行數, M:輸出陣列的列數,
其特點是k 對角線上的值為 1,其余值全部為0,k表示從下標第幾個開始, k:對角線索引:0(默認)是指主對角線,正值是指上對角線,負值是指下對角線,
9). np.random.randint(low,high,size):生成隨機的整數型矩陣,low 表示最小值, high表示最大值,size 是一個元祖型別 size = shape,
10). np.random.randn( ):生成標準的正太分布,沒有固定的引數,每多加一個數字,代表多增加一個維度,高斯正太分布=高斯分布 ,分布:是統計學中的,標準的高斯分布 的中間值是0 ,最好的范圍是1 -1,超出范圍的都是例外值,
11). np.random.random(size):生成0-1之間的元素陣列,size 表形狀,random隨即生產的范圍是0-1之間,每個亂數都是一個維度,
12). np.random.rand( ):生成0-1之間的元素陣列,和 np.random.random有一樣的功能,random 需要 size來描述形狀,而rand只需要我們直接給值,通過值的數量來確定形狀,
13). np.random.normal(loc,scale,size):生成一個正太分布的陣列,location 是定位的的值, scale 是波動值,size 是資料長度,
14). np.logspace(start,stop,num,base=10.0):生一個有規律的求對數的一維陣列 ,線性生成,全閉區間,start從幾開始 ,stop 到數字結尾, num生成多少個數 默認50,base是底數 默認以10為底,
15). np.diag(v,k=0):生成一個對角矩陣,v可以是一維或二維的矩陣,k<0表示斜線在矩陣的下方,k>0表示斜線在矩陣的上方,
代碼演示示例:
1 import numpy as np 2 3 # 1.隨機生成一個ndarray 4 np.ndarray(shape=(5,4,3),dtype=np.uint8) 5 6 # 2.將串列或元組轉換為 ndarray 陣列 7 arr1 = np.array([1, 2, 3, 4, 5]) # array([0, 1, 2, 3, 4]) 8 arr2 = np.array((1,2,3,4,5)) # array([0, 1, 2, 3, 4]) 9 np.array(range(5)) # array([0, 1, 2, 3, 4]) 10 11 # 3.生成一個有規律增長的一維陣列,左閉右開區間 12 np.arange(0,10,2,np.float16) # array([0., 2., 4., 6., 8.], dtype=float16) 13 14 # 4.生成一個有規律增長的一維陣列,全閉區間 15 np.linspace(0,10,num=10,dtype='uint8') # array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10], dtype=uint8) 16 17 # 5.生成一個元素全部都為1的陣列 18 np.ones((10,10)) # 十行十列全部為 1 的多維陣列 19 20 # 6.生成一個元素全部為0的陣列 21 zeros = np.zeros((3,3)) # 三行三列全為 0 的陣列 22 23 # 7.自定義填充值的陣列 24 np.full((3,3),'你好') # 三行三列全為‘你好’的陣列,dtype='<U2' 25 26 # 8.生成一個單位矩陣 27 I = np.eye(3) # 三行三列對角線為1,其余全為 0 的陣列 28 29 # 9.生成隨機的整數型矩陣 30 np.random.randint(low=10,high=150,size=(5,4)) # 生成10-150之間的五行四列整數陣列 31 32 # 10.標準的正太分布 33 np.random.randn(3,3) # 三行三列-1~1之間的陣列 34 35 # 11./12.生成0-1之間的元素陣列 36 np.random.random(size=(3,3)) # 三行三列0-1之間的元素陣列 37 np.random.rand(3,3) # 三行三列0-1之間的元素陣列 38 39 # 13.生成一個正太分布的陣列 40 np.random.normal(10,scale=10,size=(3,3)) # 生成0-20之間的數,三行三列有例外值的陣列 41 42 # 14.生一個有規律的求對數的一維陣列 43 np.logspace(0,49,base=10.0) # 生成50個0-49之間的以10為底的陣列 44 # np.log2(N):底數為二的對數 45 # np.log10(N):為10的對數 46 47 # 15.生成一個對角矩陣 48 np.diag([1,2],k=-1) # array([[0, 0, 0], 49 # [1, 0, 0], 50 # [0, 2, 0]])
【補充】:
range()是一個可迭代物件;arange()直接生成一個陣列型別
字典可以轉變為陣列,但是無法使用;arr=np.array({'a':1,"b":2})
零矩陣 = 代數中的0,單位矩陣=代數中的1;主對角線上全為1的矩陣是單位矩陣,單位矩陣必定是一個方陣
線性代數的乘法;線性代數中有+ — × 但是沒有除法(逆矩陣),*只能做普通代數乘法,矩陣的乘法是 np.dot(A,B),np.dot():線性代數的乘法,A*B != B*A
numpy中的屬性:
1 ''' 2 ndarray.size:查看元素的總量 ***** 3 ndarray.ndim:查看陣列的維度 4 ndarray.shape:查看陣列的形狀 ***** 5 ndarray.dtype:查看資料型別 ***** 6 ndarray.imag:獲取復數的虛數部分 7 ndarray.real:獲取復數的實數部分 8 ndarray.T:陣列的轉置 9 ndarray.itemsize:查看陣列占用的位元組數 10 ndarray.nbytes:查看陣列中每個元素總和的位元組數 11 ndarray.strides:數字的遞進位元組數 資料步長 ***** 12 ndarray.transpose():陣列的轉置 13 ndarray.astype():轉變資料型別,但是不會對原資料產生影響 14 '''
numpy的索引:
一維陣列與串列一樣;numpy的索引支持層級索引;index可以重復
1 B = np.array([[[1,2,3],[4,5,6],[7,8,9]]]) 2 B # array([[[1, 2, 3], 3 [4, 5, 6], 4 [7, 8, 9]]]) 5 B[0][0][0] # 1 取出第一行第一列 6 B[0,0,0] # 1 取出第一行第一列,這樣的層級索引list不支持 8 9 nd = np.arange(10,20) 10 nd # array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) 11 nd[[0,0,0,1,0,0]] # array([10, 10, 10, 11, 10, 10]) 里面是索引,使用串列的方式可以重復的去獲取
重設形狀 reshape:
reshape 可以在不改變陣列資料的同時,改變陣列的形狀;numpy.reshape(nd,shape) == array.reshape(shape) ;該函式不對原陣列產生影響,元素的總量不能改變;如果在reshape寫上-1,代表剩余的元素數量;nd.reshape(-1):表示陣列的展開,
1 nd = np.arange(10,20) 2 nd.shape # (10,) 3 # np.reshape(nd,(2,5)) 相當于 np.reshape(nd,(-1,5)) 相當于nd.reshape((2,5)) 4 np.reshape(nd,(2,5)) #array([[10, 11, 12, 13, 14], 5 # [15, 16, 17, 18, 19]]) 6 # nd.reshape(5,2) 相當于 nd.reshape(5,-1) 7 nd.reshape(5,2) 8 # array([[10, 11], 9 # [12, 13], 10 # [14, 15], 11 # [16, 17], 12 # [18, 19]])
陣列展開 ravel:無論是幾維的陣列,直接展開變為一維,ndarray.ravel() ;陣列的展開,變成一維陣列ndarry.reshape(-1) ,
級聯 concatenate:
級聯就是將多個陣列進行合并,axis:軸,axis=1,列合并,行必須相等 x軸的事;axis=0,行合并,列必須相等 y軸的事;np.concatenate((a1,a2,...)):需要被合并的陣列可以放在元祖中;np.concatenate([a1,a2,...]):也可以放在串列中,
堆做級聯 hstack|vstack,hstack:水平的合并;vstack:垂直的合并,這兩個函式中沒有axis引數,填入的引數必須被小括號或中括號包裹,水平 np.hstack((nd1,nd2));垂直 np.vstack([nd1,nd2]),
副本:所有賦值運算不會為ndarray的任何元素創建副本,對賦值后的物件的操作也對原來的物件生效,可使用ndarray.copy()函式創建副本,
聚合函式:
1 # axis:軸,軸的排序y-x-z = 0,1,2 2 # 每一個聚合函式中都有axis,我們可以對指定的維度進行計算 3 ''' 4 np.sum():求和 5 np.nansum():將NaN當作0處理 6 np.max():求最大值 7 np.min():求最小值 8 np.mean():均值 9 np.argmax():找出最大值的索引 10 np.argmin():找出最小值的索引 11 np.std():求標準差 12 np.var():方差 13 np.argwhere():條件查詢,并回傳符合條件的索引(最好能展開) 14 '''
代碼演示示例:
1 # 一維陣列 2 nd1 = np.random.randint(0,10,10) 3 np.sum(nd1) 4 nd1.sum() 5 ? 6 # 二維的陣列 7 nd2 = np.random.randint(0,100,(5,4)) 8 nd3.sum() # 求陣列元素的總和 9 nd3.sum(axis=0) # 將行的值全加和,得到的是列的個數 10 nd3.sum(axis=1) # 將列的值全加和,得到的是行的個數 11 ? 12 # 三維的陣列 13 nd3 = np.random.randint(0,100,(5,4,3)) 14 nd3.sum(axis=-1) # 求最和一維的和 15 nd3.sum(axis=-1).sum(axis=-1) # 求最后兩維的和 16 nd3.sum(axis=(-1,-2)) # 求最后兩維的和,axis支持元祖型別的值 17 ? 18 # 求最大值 19 nd3.max() 20 nd3.min(axis=-1) # 最后一維 21 np.max(nd3,axis=-1) # 最后一維 22 ? 23 # 求平均值 24 nd3.mean() 25 ? 26 # 回傳的是最小數的下標,第一個出現的 27 np.argmin(np.array([0,1,2,3,4,5,6,7,8,9,10,0,0,])) # 0 28 # 回傳的是最大數的下標,第一個出現的 29 np.argmax(np.array([1,2,3,4,5,6,7,8,9,10,10,10])) # 9 30 ? 31 # argwhere是條件查詢的方法,回傳符合條件的索引 32 A = np.random.randint(0,100,(4,4)) 33 display(A) 34 # array([[88, 21, 57, 99], 35 # [54, 10, 42, 92], 36 # [93, 0, 1, 88], 37 # [50, 23, 34, 49]]) 38 39 index = np.argwhere(A.ravel()>=50) 40 index.ravel() # array([ 0, 2, 3, 4, 7, 8, 11, 12], dtype=int64) 41 42 # 要想查找某個制定的值,我們可以先展開陣列,再展開索引 43 A.ravel() # array([88, 21, 57, 99, 54, 10, 42, 92, 93, 0, 1, 88, 50, 23, 34, 49]) 44 A.ravel()[index.ravel()] # array([88, 57, 99, 54, 92, 93, 88, 50]) 45 ? 46 # 另一種方式 47 cond = A.ravel()>=50 48 cond # array([ True, False, True, True, True, False, False, True, True, False, False, True, True, False, False, False]) 49 #如果索引是bool型,值回傳結果為True的 50 A.ravel()[cond] # array([61, 93, 53, 76, 88, 66, 96, 76, 77, 88, 92, 84, 50, 98])
注意:NaN != NaN;NaN + 任何數 = NaN
陣列元素的回圈:
1 # 串列 2 list_ = [0, 1, 2] 3 list_*3 # list會回圈3次 , [0, 1, 2, 0, 1, 2, 0, 1, 2] 4 #list_ + 3 # 會報錯 5 6 # 數祖 7 ndarr = np.array(range(10)) 8 ndarr # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 9 ndarr*3 # array([ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27]) 向量 × 標量 10 ndarr+3 # array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) 11 ndarr/3 # array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0]) 12 np.tile(ndarr,3) # 將所有的元素回圈3次,array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 13 14 # 二維陣列 15 ndarr2 = np.random.randint(0,10,(3,3)) 16 ndarr2 17 #array([[7, 7, 8], 18 # [2, 2, 5], 19 # [5, 7, 4]]) 20 np.tile(ndarr2,3) 21 #array([[7, 7, 8, 7, 7, 8, 7, 7, 8], 22 # [2, 2, 5, 2, 2, 5, 2, 2, 5], 23 # [5, 7, 4, 5, 7, 4, 5, 7, 4]]) 24 25 np.repeat(ndarr2,3) # array([7, 7, 7, 7, 7, 7, 8, 8, 8, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 7, 7, 7, 4, 4, 4]) 26 np.repeat(ndarr2,3,axis=0) # 行增加 27 # array([[7, 7, 8], 28 # [7, 7, 8], 29 # [7, 7, 8], 30 # [2, 2, 5], 31 # [2, 2, 5], 32 # [2, 2, 5], 33 # [5, 7, 4], 34 # [5, 7, 4], 35 # [5, 7, 4]]) 36 np.repeat(ndarr2,3,axis=1) # 列增加 37 # array([[7, 7, 7, 7, 7, 7, 8 , 8 , 8], 38 # [2, 2, 2, 2, 2, 2, 5 , 5 , 5], 39 # [5, 5, 5, 7, 7 , 7, 4 , 4 , 4]])
ndarray的矩陣操作:
算術運算子:加減乘除,ndarray.dot():矩陣乘法,ndarray.multiply():普通乘法 ,np.add():加法,要求行列相同,np.linalg.inv():逆矩陣,
np.add(nd1,nd2) == nd1+nd2 : 普通的加法,將兩個矩陣的對應位置進行相加,行列相同
nd1 + 3 : 普通的加法,將矩陣的每個位置都加3
nd1 - 3 : 普通的加法,將矩陣的每個位置都減3
nd1*nd2 == np.multiply(nd1,nd2) : 是普通的乘法,將兩個矩陣的對應位置進行相乘法,不是矩陣的乘法
nd1/2 : 普通的除法,將兩個矩陣的對應位置都除以2
np.dot(nd1.T,nd2) #矩陣乘法np.dot() 4*5 dot 5*4 = 4*4
np.dot(nd1,nd2.T) #矩陣乘法np.dot() 5*4 dot 4*5 = 5*5
矩陣的算術中沒有除法,只有逆矩陣,
滿秩矩陣(一定要是一個方陣,一個方陣不一定是滿秩矩陣,可能是奇異矩陣:a = np.matrix([[1,2],[3,4]])
逆矩陣 : 矩陣自己 × 自己的逆 = 單位 1
a = np.matrix([[1,2],[3,4]]) -------.> a_inv = np.linalg.inv(a) --------> np.dot(a,a_inv) # 1
廣播機制:廣播機制值得是陣列除以或乘以某一個標量,會使得每一個陣列元素都乘以或除以該標量
ndarray的排序:
快速排序,np.sort()與ndarray.sort()都可以,但有區別; np.sort()不改變輸入 ;ndarray.sort()本地處理,不占用空間,但改變輸入,
ndarray.sort(axis=-1,kind='quicksort',order=None)
numpy.sort(a,axis=-1,kind='quicksort',order=None)
axis:排序沿著陣列的方向,0表示按行,1表示按列;kind:排序的演算法,提供了快排、混排、堆排,'quicksort', 'mergesort', 'heapsort' ---> 快速 歸并排序 堆排序;order:不是指的順序,以后用的時候再去分析這個,
部分排序,ndarray.partition() == np.partition(a,k),有的時候我們不是對全部資料感興趣,我們可能只對最小或最大的一部分感興趣,當k為正時,我們想要得到最小的k個數;當k為負時,我們想要得到最大的k個數,
ndarr3 = np.random.randint(0,20,10) ndarr3.sort() # 對原資料產生影響 ndarr3[::-1] # 降序排列 # 部分排序 # 獲取最小的5個數 ndarr4 = np.random.randint(0,10000,100) ndarr4.partition(5) ndarr4[:5] # 獲取最大的5個數 ndarr4.partition(-5) ndarr4[::-1][:5]
檔案 I/O 創建陣列
CSV檔案:
#方法一:
保存檔案
np.savetxt('gb.csv',A) #沒報錯就代表成功 A表示一個一維或者二維的陣列即可
讀取檔案
np.loadtxt('gb.csv')
?
#方法二:
使用 numpy.save 與 numpy.load 保存和讀取:
保存的是.npy型別的檔案
保存檔案
np.save('a.npy',A)
讀取檔案
np.load('a.npy')
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/181825.html
標籤:Python
