Numpy支持大量的維度數組和矩陣運算,對數組運算提供了大量的數學函數庫!算法
Numpy比Python列表更具優點,其中一個優點即是速度。在對大型數組執行操做時,Numpy的速度比Python列表的速度快了好幾百。由於Numpy數組自己能節省內存,而且Numpy在執行算術、統計和線性代數運算時採用了優化算法。數組
Numpy的另外一個強大功能是具備能夠表示向量和矩陣的多維數組數據結構。Numpy對矩陣運算進行了優化,使咱們可以高效地執行線性代數運算,使其很是適合解決機器學習問題。數據結構
與Python列表相比,Numpy具備的另外一個強大優點是具備大量優化的內置數學函數。這些函數使你可以很是快速地進行各類複雜的數學計算,而且用到不多代碼(無需使用複雜的循環),使程序更容易讀懂和理解。app
Numpy簡單建立數組
1 a = [1, 2, 3] 2 b = np.array(a) 3 c = np.array([[0, 1, 2, 10], 4 [12, 13, 100, 101], 5 [102, 110, 112, 113]], int) 6 print(c) 7 print(b)
建立數值爲1的數組dom
Numpy.ones(參數 1:shape,數組的形狀;參數 2:dtype, 數值類型)機器學習
1 array_one = np.ones([10, 10], dtype=np.int) 2 print(array_one)
建立數值爲0的數組ide
Numpy.zeros(參數 1:shape,數組的形狀;參數 2:dtype, 數值類型)函數
1 array_zero = np.zeros([10, 9], dtype=np.float) 2 print(array_zero)
建立指定數值的數組post
Numpy.full(參數 1:shape,數組的形狀; 參數 2:constant value,數組填充的常數值;參數 3:dtype, 數值類型)學習
1 array_full = np.full((2, 3), 5) 2 print(array_full)
建立單位矩陣
Numpy.eye(參數 1:N,方陣的維度)
1 array_eye = np.eye(5) 2 print(array_eye)
建立對角矩陣
Numpy.diag(參數1:v,主對角線數值,參數 2:k,對角線元素):K = 0表示主對角線,k>0的值選擇在主對角線之上的對角線中的元素,k<0的值選擇在主對角線之下的對角線中的元素
1 array_diag = np.diag([10, 20, 30, 40]) 2 print(array_diag)
Numpy查看數組屬性
數組元素個數:b.size
數組形狀:b.shape
數組維度:b.ndim
數組元素類型:b.dtype
# 數組元素個數:3 print(b.size) # 數組形狀:(3,) print(b.shape) # 數組維度:1 print(b.ndim) # 數組元素類型:int32 print(b.dtype)
矩陣第一維的長度:shape[0] # 行
矩陣第二維的長度:shape[1] # 列
.......
1 array_rand = np.random.rand(10, 10, 4) 2 print(array_rand) 3 print(array_rand.ndim) 4 print(array_rand.shape[0]) 5 print(array_rand.shape[1]) 6 print(array_rand.shape[2])
Numpy建立隨機數組(np.random)
均勻分佈
建立指定形狀的數組,數值範圍在0~1之間
1 array_rand = np.random.rand(10, 10, 4) 2 print(array_rand) 3 print(array_rand.ndim)
建立指定範圍內的一個數:Numpy.random.uniform(low, high, size=None)
1 array_uniform = np.random.uniform(0, 100, size=5) 2 print(array_uniform)
建立指定範圍的一個整數:Numpy.random.randint(low, high, size=None)
1 array_int = np.random.randint(0, 100, size=3) 2 print(array_int) 3 print(array_int.size)
Numpy.arange()和Numpy.linspace()函數也能夠均勻分佈
Numpy.arange(start, stop, step):建立一個秩爲1的array,其中包含位於半開區間[start, stop)內並均勻分佈的值,step表示兩個相鄰值之間的差。
Numpy.linspace(start, stop, N):建立N個在閉區間[start, stop]內均勻分佈的值。
1 X = np.arange(1, 5, 2, dtype=np.int) 2 print(X) 3 y = np.linspace(1, 5, 3) 4 print(y)
正態分佈
建立給定均值、標準差、維度的正態分佈:Numpy.random.normal(loc, scale, size)
1 # 正態生成4行5列的二位數組 2 array_normal = np.random.normal(loc=1.75, scale=0.1, size=[4, 5]) 3 print(array_normal) 4 print(array_normal.ndim)
Numpy數組操做
數組的索引
array[start : end]
array[start:]
array[:end]
布爾型索引:array[array>10 & array<20]
np.random.seed(10) arr = np.random.randint(0,100,size=(5,6)) arr
array([[ 9, 15, 64, 28, 89, 93], [29, 8, 73, 0, 40, 36], [16, 11, 54, 88, 62, 33], [72, 78, 49, 51, 54, 77], [69, 13, 25, 13, 92, 86]])
arr[[1,2]]
array([[29, 8, 73, 0, 40, 36], [16, 11, 54, 88, 62, 33]])
數組的切片
arr[0:2]
array([[ 9, 15, 64, 28, 89, 93], [29, 8, 73, 0, 40, 36]])
#獲取二維數組前兩列 arr[:,0:2]
array([[ 9, 15], [29, 8], [16, 11], [72, 78], [69, 13]])
#獲取二維數組前兩行和前兩列數據 arr[0:2,0:2]
array([[ 9, 15], [29, 8]])
#將數組的行倒序 arr[::-1]
array([[69, 13, 25, 13, 92, 86], [72, 78, 49, 51, 54, 77], [16, 11, 54, 88, 62, 33], [29, 8, 73, 0, 40, 36], [ 9, 15, 64, 28, 89, 93]])
#列倒序 arr[:,::-1]
array([[93, 89, 28, 64, 15, 9], [36, 40, 0, 73, 8, 29], [33, 62, 88, 54, 11, 16], [77, 54, 51, 49, 78, 72], [86, 92, 13, 25, 13, 69]])
#所有倒序 arr[::-1,::-1]
array([[86, 92, 13, 25, 13, 69], [77, 54, 51, 49, 78, 72], [33, 62, 88, 54, 11, 16], [36, 40, 0, 73, 8, 29], [93, 89, 28, 64, 15, 9]])
數組的複製
Numpy.copy(參數 1:數組):建立給定array的一個副本,還可當作方法用。
1 after_array = array_normal[:3, 2:4].copy() 2 copy_array = np.copy(array_normal[:, 2:4])
數組排序
Numpy.sort(參數 1:a,數組;參數 2:axis=0/1,0表示行1表示列):np.sort()做爲函數使用時,不更改被排序的原始array;array.sort()做爲方法使用時,會對原始array修改成排序後數組array
1 # 總體排序 2 np.sort(array_normal) 3 # 僅行排序 4 np.sort(array_normal, axis=0) 5 # 僅列排序 6 np.sort(array_normal, axis=1)
數組惟一元素
Numpy.unique(參數 1:a,數組;參數 2:return_index=True/False,新列表元素在舊列表中的位置;參數 3:return_inverse=True/False,舊列表元素在新列表中的位置;參數 4:return_counts,元素的數量;參數 5:axis=0/1,0表示行1表示列):查找array中的惟一元素。
1 print("提取惟一元素", np.unique(array_normal)) 2 print("提取惟一元素", np.unique(array_normal, return_index=True)) 3 print("提取惟一元素", np.unique(array_normal, return_counts=True)) 4 print("提取惟一元素", np.unique(array_normal, return_index=True, return_inverse=True, axis=0))
數組的改變
數組轉置
1 array_normal.T
reshape():把指定的數組改變形狀,可是元素個數不變;有返回值,即不對原始多維數組進行修改
1 c = np.array([[[0, 1, 2], 2 [10, 12, 13]], 3 [[100, 101, 102], 4 [110, 112, 113]]]) 5 """ 6 [[[ 0 1] 7 [ 2 10]] 9 [[ 12 13] 10 [100 101]] 12 [[102 110] 13 [112 113]]] 14 """ 15 print(c.reshape(3, 2, 2)) 16 """ 17 [[ 0 1 2 10] 18 [ 12 13 100 101] 19 [102 110 112 113]] 20 """ 21 # 某一維指定爲-1時,自動計算維度 22 print(c.reshape(3, -1)) 23 """[[[ 0 1] 24 [ 2 10] 25 [ 12 13]] 26 27 [[100 101] 28 [102 110] 29 [112 113]]]""" 30 print(c.reshape(2, -1, 2))
resize():把指定的數組改變形狀,可是元素個數可變,不足補0;無返回值,即對原始多維數組進行修改
1 a = np.array([[[0, 1, 2], 2 [10, 12, 13]], 3 [[100, 101, 102], 4 [110, 112, 113]]]) 5 b = np.array([[[0, 1, 2], 6 [10, 12, 13]], 7 [[100, 101, 102], 8 [110, 112, 113]]]) 9 '''[[0] 10 [1] 11 [2]]''' 12 a.resize((3, 1)) 13 '''[[ 0 1 2 10 12] 14 [ 13 100 101 102 110] 15 [112 113 0 0 0]]''' 16 b.resize((3, 5)) 17 print(a) 18 print(b)
數組的級聯
np.concatenate((arr,arr),axis=1)
array([[ 9, 15, 64, 28, 89, 93, 9, 15, 64, 28, 89, 93], [29, 8, 73, 0, 40, 36, 29, 8, 73, 0, 40, 36], [16, 11, 54, 88, 62, 33, 16, 11, 54, 88, 62, 33], [72, 78, 49, 51, 54, 77, 72, 78, 49, 51, 54, 77], [69, 13, 25, 13, 92, 86, 69, 13, 25, 13, 92, 86]])
級聯須要注意的點:
- 級聯的參數是列表:必定要加中括號或小括號
- 維度必須相同
- 形狀相符:在維度保持一致的前提下,若是進行橫向(axis=1)級聯,必須保證進行級聯的數組行數保持一致。若是進行縱向(axis=0)級聯,必須保證進行級聯的數組列數保持一致。
- 可經過axis參數改變級聯的方向
*Numpy計算
條件運算
Numpy.where(condition, x, y):三目運算知足condition,爲x;不知足condition,則爲y
1 score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]]) 2 # 若是數值小於80,替換爲0,若是大於等於80,替換爲90 3 re_score = np.where(score < 80, 0, 90) 4 print(re_score)
統計運算
指定軸最大值:amax(參數1:數組;參數2:axis=0/1,0表示行1表示列)
1 # 求整個矩陣的最大值 2 result = np.amax(score) 3 print(result) 4 # 求每一列的最大值(0表示行) 5 result = np.amax(score, axis=0) 6 print(result) 7 # 求每一行的最大值(1表示列) 8 result = np.amax(score, axis=1) 9 print(result)
指定軸最小值:amin(參數1:數組;參數2:axis=0/1,0表示行1表示列)
1 # 求整個矩陣的最小值 2 result = np.amin(score) 3 print(result) 4 # 求每一列的最小值(0表示行) 5 result = np.amin(score, axis=0) 6 print(result) 7 # 求每一行的最小值(1表示列) 8 result = np.amin(score, axis=1) 9 print(result)
指定軸平均值:mean(參數1:數組;參數2:axis=0/1,0表示行1表示列;參數3:dtype,輸出數據類型)
1 # 求整個矩陣的平均值 2 result = np.mean(score, dtype=np.int) 3 print(result) 4 # 求每一列的平均值(0表示行) 5 result = np.mean(score, axis=0) 6 print(result) 7 # 求每一行的平均值(1表示列) 8 result = np.mean(score, axis=1) 9 print(result)
指定軸方差:std(參數1:數組;參數2:axis=0/1,0表示行1表示列;參數3:dtype,輸出數據類型)
1 # 求整個矩陣的方差 2 result = np.std(score) 3 print(result) 4 # 求每一列的方差(0表示列) 5 result = np.std(score, axis=0) 6 print(result) 7 # 求每一行的方差(1表示行) 8 result = np.std(score, axis=1) 9 print(result)
相似的,求和:Numpy.sum(),求中值:Numpy.median
數組運算
數組與數的運算(加、減、乘、除、取整、取模)
1 # 循環數組行和列,每個數值都加5 2 score[:, :] = score[:, :]+5 3 print(score) 4 # 循環數組行和列,每個數值都減5 5 score[:, :] = score[:, :]-5 6 print(score) 7 # 循環數組行和列,每個數值都乘以5 8 score[:, :] = score[:, :]*5 9 print(score) 10 # 循環數組行和列,每個數值都除以5 11 score[:, :] = score[:, :]/5 12 print(score) 13 # 循環數組行和列,每個數值除以5取整 14 score[:, :] = score[:, :] // 5 15 print(score) 16 # 循環數組行和列,每個數值除以5取模 17 score[:, :] = score[:, :] % 5 18 print(score)
數組間運算(加、減、乘、除),前提是兩個數組的shape同樣
加:「+」或者np.add(a, b) 減:「-」或者np.subtract(a, b)
乘:「*」或者np.multiply(a, b) 除:「/」或者np.divide(a, b)
1 c = score + score 2 d = score - score 3 e = score * score 4 # 分母數組保證每一個數值不能爲0 5 b = score / score
Numpy.intersect1d(參數 1:數組a;參數 2:數組b):查找兩個數組中的相同元素
Numpy.setdiff1d(參數 1:數組a;參數 2:數組b):查找在數組a中不在數組b中的元素
Numpy.union1d(參數 1:數組a;參數 2:數組b):查找兩個數組的並集元素
矩陣運算(一種特殊的二維數組)
計算規則
(M行,N列)*(N行,Z列)=(M行,Z列)
1 st_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]]) 2 # 平時成績佔40% 期末成績佔60%, 計算結果 3 q = np.array([[0.4], [0.6]]) 4 result = np.dot(st_score, q) 5 print(result)
矩陣拼接
矩陣垂直拼接(前提兩個兩個矩陣列數相同,行數隨意):vstack(參數:tuple)
1 v1 = [[0, 1, 2, 3, 4, 5], 2 [6, 7, 8, 9, 10, 11]] 3 v2 = [[12, 13, 14, 15, 16, 17], 4 [18, 19, 20, 21, 22, 23], 5 [18, 19, 20, 21, 22, 23]] 6 result = np.vstack((v1, v2)) 7 print(result)
矩陣水平拼接(前提兩個兩個矩陣行數相同,列數隨意):hstack(參數:tuple)
1 v1 = [[0, 1, 2, 3, 4, 5], 2 [6, 7, 8, 9, 10, 11]] 3 v2 = [[12, 13, 14, 15, 16, 17], 4 [18, 19, 20, 21, 22, 23]] 5 result = np.hstack((v1, v2)) 6 print(result)
矩陣刪除:Numpy.delete(參數 1:a,數組;參數 2:elements,刪除的對象;參數 3:axis=0/1)
1 OriginalY = np.array([[1, 2, 3], 2 [4, 5, 6], 3 [7, 8, 9]]) 4 print(np.delete(OriginalY, [0, 2])) 5 print(np.delete(OriginalY, [0, 2], axis=0)) 6 print(np.delete(OriginalY, [0, 2], axis=1))
矩陣添加:Numpy.append(參數 1:array,數組;參數 2: elements,添加元素;參數 3: axis=0/1)
1 OriginalY = np.array([[1, 2, 3], 2 [4, 5, 6], 3 [7, 8, 9]]) 4 # 末尾添加元素 5 print(np.append(OriginalY, [0, 2])) 6 # 最後一行添加一行 7 print(np.append(OriginalY, [[0, 2, 11]], axis=0)) 8 # 最後一列添加一列(注意添加元素格式) 9 print(np.append(OriginalY, [[0], [2], [11]], axis=1))
矩陣插入:Numpy.insert(參數 1:array,數組;參數 2:index,插入位置索引;參數 3: elements,添加元素;參數 4: axis=0/1)
1 OriginalY = np.array([[1, 2, 3], 2 [4, 5, 6], 3 [7, 8, 9]]) 4 print(np.insert(OriginalY, 1, [11, 12, 10])) 5 print(np.insert(OriginalY, 1, [[11, 12, 10]], axis=0)) 6 # 在列索引1的位置插入(注意元素格式,跟添加格式不一樣) 7 print(np.insert(OriginalY, 1, [[11, 12, 10]], axis=1))
文件加載
np.loadtxt(fname,dtype,comments='#',delimiter=None,skiprows=0,usecols=None)
fname:讀取的文件、文件名
dtype:數據類型
comments:註釋
delimiter:分隔符,默認是空格
skiprows:跳過前幾行讀取,默認是0
usecols:讀取哪些列,usecols=(1, 2, 5)讀取第1,2,5列,默認全部列