Python基礎知識準備-Numpy
Numpy
Numpy是Python中做科學計算的核心庫之一,它提供了一個高效多維陣列實體(object),和對這些陣列的各種功能函式。
1.Array
一組同類型的資料,可以由一個非負整數來進行索引查詢裡面的元組。
-
初始化
a) 指定陣列import numpy as np a = np.array[1,2,3]) b = np.array([1,2,3],[4,5,6])
b) 全零陣列
a = np.zeros((2,2))
a = [ [0,0]
[0,0] ]
c) 全一陣列b = np.ones((2,2))
b = [ [1,1]
[1,1] ]
d) 全填同一數值c = np.full((2,2),7)
c = [ [7,7]
[7,7] ]
e) 單位矩陣(我有時候習慣用矩陣來方便計算思考)d = np.eye(2)
d = [ [1,0]
[0,1] ]
f) 隨機生成矩陣e = np.random.random((2,2))
e = [ [0.25783470,0.72843901]
[0.84993205,0.23794522] ]2.Array indexing
Numpy提供一些陣列的檢索方式(我也不確定叫做‘檢索’是否準確,不過看具體函式明白是幹什麼的就可以)
a) 切片Slicing(一些我不確定翻譯都帶上原文
和Python中的列表操作一樣,Numpy的陣列也可以被切片。因為陣列本身可能是多維的,所以需要定義片的樣式。imoprt numpy an np a = np.array([1,2,3,4],[5,6,7,8],[9,10,11,12]]) # a = [[1,2,3,4] [5,6,7,8] [9,10,11,12]] b = a[:2,1:3] # b = [[2,3] [6,7]] # 注意此時如果修改b的值,在a中對應的值也會相應改變 print (a[0,1]) #2 print (b[0,0]) #2 b[0,0] = 77 print (a[0,1]) #77
b) 整型陣列索引
整型陣列索引允許我們使用一個數組的資料來組成一個全新陣列。import numpy as np a = np.array([[1,2],[3,4],[5,6]]) print (a[[0,1,2],[0,1,0]]) #[1,4,5]
一個有用的小技巧是使用整型索引來從一個矩陣的每一行中選取或改變一個元素。
import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) # a = [[1,2,3] [4,5,6] [7,8,9] [10,11,12] b = np.array([0,2,0,1]) print (a[np.arange(4),b]) # [1,6,7,11] a[np.arange(4),b] += 10 #a = [[11,2,3] [4,5,16] [17,8,9] [10,21,12]
c)布林陣列索引
布林陣列索引允許我們從一個數組從提取任意元素。通常用來篩選元素。import numpy as np a = np.array([[1,2],[3,4],[5,6]]) bool_idx = (a>2) print (bool_idx) # [[False,False] [True,True] [True,True]] print (a[bool_idx]) #[3,4,5,6] print (a[a>2]) # [3,4,5,6]
3.Datatype資料型別
每一個numpy陣列由一系列同類型的元素組成。numpy提供了許多數值型別,並嘗試在使用者定義陣列的時候去猜測資料的型別,構造陣列的函式也包含一個可選引數用於明確生命資料型別。
import numpy as np x = np.array([1,2]) print(x.dtype) # int64 x = np.array([1,2],dtype = np.int64)
4.陣列的數學運算
import numpy as np x = np.array([[1,2],[3,4]]) y = np.array([[5,6],[7,8]])
加
add = x+y add = np.add(x,y)
[[6,8]
[10,12]]減
sub = x-y sub = np.subtract(x,y)
[[-4,-4]
[-4,-4]]乘
mult = x*y mult = np.multiply(x,y)
[[5,12]
[21,32]]
注意,*運算子是指矩陣內對應位置的元素相乘,並不是矩陣相乘。矩陣乘運算的函式是dot()import numpy as np x = np.array([[1,2],[3,4]]) y = np.array([[5,6],[7,8]]) v = np.array([9,10]) w = np.array([11,12]) print (v.dot(w)) # 219 print (np.dot(v,w)) # 219 print (x.dot(y)) #[29,67] print (np.dot(v,w)) #[29,67] print (x.dot(y)) print (np.dot(x,y)) #[[19,22] [43,50]]
除
print (x/y) print (np.divide(x,y))
開根號
print (np.sqrt(x))
矩陣內元素求和
x = np.array([[1,2],[3,4]]) print (np.sum(x)) #10 print (np.sum(x,axis=0)) #[4,6]列求和 print (np.sum(x,axis=1)) #[3,7]行求和
除了使用數學函式,我們也時常需要調整矩陣大小或者進行資料調整(矩陣倒置什麼的)
import numpy as np x = np.array([[1,2],[3,4]]) print (x) #[[1,2] [3,4]] print (x.T) #[[1,3] [2,4]]
5.Broadcasting
Broadcasting 是一種強大的機制(mechanism),當在較大的矩陣上進行關鍵操作時,可以使用不同形狀的矩陣。(英語太差了,理解不能,原文附上:
Broadcasting is a powerful mechanism that allows numpy to work with array of different shapes when performing arithmetic operations.Frequently we have a smaller array and a large array, and we want to use the smaller array multiple times to perform some operation on the larger array.)
還是看例子:import numpy as np x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) v = np.array([1,0,1]) y = np.empty_like(x) for i in range(4): y[i,:] = x[i,:] + v
上述是一種方式,但是當矩陣x非常大的時候,計算一個指定的迴圈在python中將會比較慢。注意到將矩陣v的每一行和矩陣x相加能達到上述效果,所以可以使用向量v構造一個矩陣w,使w和x相加。
import numpy as np x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) v = np.array([1,0,1]) w = np.tile(v,(4,1)) y = x + w
numpy 的broadcasting甚至允許我們如下操作來完成:
import numpy as np x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) v = np.array([1,0,1]) y = x + v