推薦學習:
Numpy是Numerical Python extensions的縮寫,字面意思是Python數值計算擴充套件。Numpy是python中眾多機器學習庫的依賴,這些庫通過Numpy實現基本的矩陣計算。
Numpy支援高階、大量計算的矩陣、向量計算,與此同時還提供了較為豐富的函數。此外,Numpy基於更加現代化的程式語言--python,python憑藉著開源、免費、靈活性、簡單易學、工程特性好等特點風靡技術圈,已經成為機器學習、資料分析等領域的主流程式語言。
numpy的array型別是該庫的一個基本資料型別,這個資料型別從字面上看是陣列的意思,也就意味著它最關鍵的屬性是元素與維度,我們可以用這個資料型別來實現多維陣列。
因此,通過這個資料型別,我們可以使用一維陣列來表示向量,二維陣列表示矩陣,並以此類推以用來表示更高維度的張量。
import numpy as np # 通過np.array()方法建立一個名為array的array型別,引數是一個list array = np.array([1, 2, 3, 4]) print(array) # 結果為:[1 2 3 4] # 獲取array中元素的最大值 print(array.max()) # 結果為:4 # 獲取array中元素的最小值 print(array.min()) # 結果為:1 # 獲取array中元素的平均值 print(array.mean()) # 結果為:2.5 # 直接將array乘以2,python將每個元素都乘以2 print(array*2) # 結果為:[2 4 6 8] print(array+1) # 結果為:[2 3 4 5] print(array/2) # 結果為:[0.5 1. 1.5 2. ] # 將每一個元素都除以2,得到浮點數表示的結果 print(array % 2) # 結果為:[1 0 1 0] array_1 = np.array([1, 0, 2, 0]) # 獲取該組資料中元素值最大的那個資料的首個索引,下標從0開始 print(array_1.argmax()) # 結果為:2
通過上面的程式碼,我們可以瞭解到Numpy中array型別的基本使用方法。
我們可以看到,array其實是一個類,通過傳入一個list引數來範例化為一個物件,從而實現了對資料的封裝。
import numpy as np # 建立一個二維陣列,用以表示一個3行2列的矩陣 array = np.array([[1, 2], [3, 4], [5, 6]]) print(array) # 檢視資料的維度屬性,下面輸出結果(3,2)表示3行2列 print(array.shape) # 結果為:(3, 2) # 檢視元素個數 print(array.size) # 結果為:6 # 檢視元素最大值的索引 print(array.argmax()) # 結果為:5 # 將shape為(3,2)的array轉換為一行表示 print(array.flatten()) # 結果為:[1 2 3 4 5 6] # 我們可以看到,flatten()方法是將多維資料「壓平」為一維陣列的過程 #將array資料從shape為(3,2)的形式轉為(2,3)的形式 print(array.reshape(2, 3)) '''結果為: [[1 2 3] [4 5 6]]''' #將array資料從shape為(3,2)的形式轉為(1,6)的形式 print(array.reshape(1, 6)) # 結果為:[[1 2 3 4 5 6]]
高階一點的就是flatten()和reshape()函數了,需要注意下reshape()返回的結果是array型別
import numpy as np # 生成所有元素為 array_zeros = np.zeros((2, 3, 3)) print(array_zeros) '''結果為: [[[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]] [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]]] ''' array_ones = np.ones((2, 3, 3)) print(array_ones) '''結果為: [[[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]] [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]] ''' print(array_ones.shape) # 結果為:(2, 3, 3)
注意:如果將(2,3,3)改為(3,3)
array_zeros = np.zeros((3, 3)) print(array_zeros) '''結果為: [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]] '''其生成的是3行3列的array
arange([start,] stop[, step,], dtype=None, , like=None)
返回給定間隔內均勻分佈的值。值在半開區間``[start, stop)``(換句話說,包括`start`但不包括`stop`的區間)內生成。對於整數引數,該函數等效於 Python 內建的 `range` 函數,但返回的是 ndarray 而不是列表。當使用非整數步長(例如 0.1)時,結果通常會不一致。對於這些情況,最好使用 `numpy.linspace`。
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
在指定的時間間隔內返回均勻分佈的數位。返回「num」個均勻分佈的樣本,在區間 [`start`, `stop`] 上計算。
start:序列的起始值。
stop:序列的結束值,除非 `endpoint` 設定為 False。在這種情況下,序列由除最後一個「num + 1」個均勻分佈的樣本之外的所有樣本組成,因此排除了「stop」。請注意,當 `endpoint` 為 False 時,步長會發生變化。
num=50:要生成的樣本數。預設值為 50。必須為非負數。
endpoint=True:如果為真,`stop` 是最後一個樣本。否則,不包括在內。預設為真。
retstep=False:如果為 True,則返回 (`samples`, `step`),其中 `step` 是樣本之間的間距。
dtype=None:輸出陣列的型別。如果 `dtype` 沒有給出,資料型別是從 `start` 和 `stop` 推斷出來的。推斷的 dtype 永遠不會是整數;即使引數會產生一個整數陣列,也會選擇`float`。
因此以下程式碼就很容易理解了
# 生成一個array,從0遞增到10,步長為1 array_arange = np.arange(10) print(array_arange) # 結果為:[0 1 2 3 4 5 6 7 8 9] # 生成一個array,從0遞增到10,步長為2 array_arange_1 = np.arange(0, 10, 2) print(array_arange_1) # 結果為:[0 2 4 6 8] # 生成一個array,將0-10等分為5部分 array_linspace = np.linspace(0, 10, 5) print(array_linspace) # 結果為:[ 0. 2.5 5. 7.5 10. ]
import numpy as np # 取絕對值 print(np.abs([1, -2, 3, -4])) # [1 2 3 4] # 求正弦值 print(np.sin(np.pi/2)) # 1.0 # 求反正切值 print(np.arctan(1)) # 0.7853981633974483 # 求e的2次方 print(np.exp(2)) # 7.38905609893065 # 求2的三次方 print(np.power(2, 3)) # 8 # 求向量[1,2]與[3,4]的點積 print(np.dot([1, 2], [3, 4])) # 11 # 求開方 print(np.sqrt(4)) # 2.0 # 求和 print(np.sum([1, 2, 3, 4])) # 10 # 求平均值 print(np.mean([1, 2, 3, 4])) #2.5 # 求標準差 print(np.std([1, 2, 3, 4])) # 1.118033988749895
前面我們已經瞭解到array型別及其基本操作方法,瞭解array型別可以表示向量、矩陣和多維張量。
線性代數計算在科學計算領域中非常重要,因此接下來瞭解以下Numpy提供的線性代數操作
import numpy as np vector_a = np.array([1, 2, 3]) vector_b = np.array([2, 3, 4]) # 定義兩入向量vector_a與vector_b m = np.dot(vector_a, vector_b) # 將兩個向量相乘,在這裡也就是點乘,結果為20 print(m) n = vector_a.dot(vector_b) print(n) # 將vector_a與vector_b相乘,結果為20 o = np.dot(vector_a, vector_b.T) print(o) ''' 將一個行向量與一個列向量叉乘的結果相當於將兩個行向量求點積,這裡測試了dot()方法。其中array型別的T()方法表示轉置。 測試結果表明: dot()方法預設對兩個向量求點積。對於符合叉乘格式的矩陣,自動進行又乘。''' # 我們看一下下面這個例子: matrix_a = np.array([[1, 2], [3, 4]]) # 定義一個2行2列的方陣 matrix_b = np.dot (matrix_a, matrix_a.T) # 這裡將該方陣與其轉置叉乘,將結果賦予matrix_b變數 print(matrix_b) '''結果為: array([[5,11], [11,25]])''' p = np.linalg.norm([1, 2]) print(p) # 求一個向量的範數的值,結果為2.2360679774997898 # 如果norm()方法沒有指定第2個引數,則預設為求2範數 np.linalg.norm([1, -2], 1) # 指定第2個引數值為1,即求1範數。我們在前面介紹過,1範數的結果為向量中各元素絕對值之和,結果為3.0 q = np.linalg.norm([1, 2, 3, 4], np. inf) print(q) # 求向量的無窮範數,其中np.inf表示正無窮,也就是向量中元素值最大的那個,其結果為4.0 r = np.linalg .norm([1, 2, 3, 4], -np.inf) print(r) # 同理,求負無窮範數的結果為1, 也就是向量中元素的最小值 # 求行列式 s = np.linalg.det(matrix_a) print(s) # -2.0000000000000004 t = np.trace(matrix_a) print(t) # 求矩陣matrix_a的跡,結果為5 u = np.linalg.matrix_rank(matrix_a) # 求矩陣的秩,結果為2 print(u) v = vector_a * vector_b # 使用*符號將兩個向量相乘,是將兩個向量中的元素分別相乘,也就是我們所講到的哈達馬乘積 print(v) # [ 2 6 12] w = vector_a ** vector_b print(w) # 使用二元運運算元**對兩個向量進行操作,結果為array([1, 8, 81],dtype = int32) # 表示將向量vector. a中元素對應vector. b中的元素值求冪運算。例如最終結果[1,8,81]可以表示為[1*1,2*2*2,3*3*3*3] # 求逆矩陣 z = np.linalg.inv(matrix_a) print(z) ''' [[-2. 1. ] [ 1.5 -0.5]]'''
Numpy除了為我們提供常規的數學計算函數和矩陣相關操作之外,還提供很多功能豐富的模組,亂數模組就是其中一部分。
利用亂數模組可以生成亂數矩陣,比python自帶的亂數模組功能還要強大。
import numpy as np # 設定亂數種子 np.random.seed() # 從[1,3)中生成一個整型的亂數,連續生成10個 a = np.random.randint(1, 3, 10) print(a) # [1 1 1 2 1 1 1 1 2 2] # 若要連續產生[1,3}之間的浮點數,可以使用以下方法: # ① b = 2*np.random.random(10)+1 print(b) ''' [2.88458839 2.07004167 2.80814156 1.83247535 2.33649809 2.62763357 2.0549351 2.33464915 1.70562208 2.66257726]''' # ② c = np.random.uniform(1, 3, 10) print(c) ''' [1.76967412 1.37703868 2.48838004 1.45986254 2.04487418 2.51107658 1.25673115 1.31416097 2.56218317 2.90575438]''' # 生成一個滿足正態分佈(高斯分佈)的矩陣,其維度是4*4 d = np. random.normal(size=(4, 4)) print(d) ''' [[ 0.76164366 0.11588368 0.49221559 -0.28222691] [ 0.47638143 -0.21197541 -1.0776362 0.49241666] [ 0.26038756 -0.20406522 1.11210954 -1.191425 ] [ 0.58255677 1.84047863 -0.21366512 -0.85425828]]''' # 隨機產生10個n=5、p=0.5的二項分佈資料: e = np.random.binomial(n=5, p=0.5, size=10) print(e) # [1 1 5 2 1 2 1 2 1 2] # 產生一個0到9的序列 data = np.arange(10) print(data) # [0 1 2 3 4 5 6 7 8 9] # 從data資料中隨機採集5個樣本,採集過程是有放回的 f = np.random.choice(data, 5) print(f) # [1 7 3 3 4] # 從data資料中隨機採集5個樣本,採集過程是沒有放回的 g = np.random.choice(data, 5, replace=False) print(g) # [8 9 1 5 0] # 對data進行亂序 h = np.random.permutation(data) print(h) # [8 5 3 9 2 0 4 6 1 7] # 對data進行亂序,並替換為新的data np.random.shuffle(data) print(data) # [9 7 0 3 8 5 2 1 4 6]
推薦學習:
以上就是詳細介紹python的numpy模組的詳細內容,更多請關注TW511.COM其它相關文章!