Python基礎(chǔ)教程之NumPy庫的使用詳解
1. 為什么要學(xué)習(xí)NumPy?
NumPy(Numerical Python)是一個用于處理數(shù)組的Python庫,學(xué)習(xí)機(jī)器學(xué)習(xí)的過程中先學(xué)會使用NumPy是非常重要的,為什么要學(xué)習(xí)NumPy呢?原因如下:
數(shù)組操作和運(yùn)算:NumPy提供了高效的數(shù)組操作和數(shù)學(xué)運(yùn)算功能,這對于處理和轉(zhuǎn)換數(shù)據(jù)是至關(guān)重要的。在機(jī)器學(xué)習(xí)中,你經(jīng)常需要對數(shù)據(jù)進(jìn)行處理、轉(zhuǎn)換和重塑,使用NumPy可以方便地進(jìn)行這些操作。
高性能計算:NumPy是基于C語言實現(xiàn)的,它的計算效率非常高。在機(jī)器學(xué)習(xí)中,處理大規(guī)模的數(shù)據(jù)和進(jìn)行復(fù)雜的數(shù)學(xué)計算是很常見的。NumPy提供了高性能的數(shù)組操作和數(shù)學(xué)運(yùn)算,能夠有效地處理這些任務(wù)。
數(shù)據(jù)表示和處理:在機(jī)器學(xué)習(xí)中,數(shù)據(jù)通常以多維數(shù)組的形式表示。NumPy提供了靈活和高效的多維數(shù)組操作,使你能夠方便地表示和處理各種類型的數(shù)據(jù),包括圖像、文本等。
庫的依賴性:許多常用的機(jī)器學(xué)習(xí)庫和框架,如Scikit-learn、TensorFlow和PyTorch,都依賴于NumPy。學(xué)會使用NumPy可以幫助你更好地理解和使用這些庫和框架,以便更好地進(jìn)行機(jī)器學(xué)習(xí)任務(wù)。
綜上所述,學(xué)習(xí)機(jī)器學(xué)習(xí)之前先學(xué)會使用NumPy是為了更好地處理和處理數(shù)據(jù)、進(jìn)行高性能計算,并為后續(xù)學(xué)習(xí)和使用其他機(jī)器學(xué)習(xí)庫打下堅實的基礎(chǔ)。
2.安裝使用NumPy
首先,我們需要確保已經(jīng)安裝了NumPy庫。可以通過在終端或命令提示符中運(yùn)行以下命令來安裝NumPy:
pip install numpy
安裝完成后,我們就可以開始使用NumPy。
#導(dǎo)入NumPy庫 import numpy as np
3.NumPy創(chuàng)建數(shù)組
NumPy最強(qiáng)大的功能之一是創(chuàng)建多維數(shù)組。我們可以使用NumPy的array()
函數(shù)來創(chuàng)建數(shù)組。
例如,我們可以創(chuàng)建一個一維數(shù)組:
arr = np.array([1, 2, 3, 4, 5]) print(arr)
輸出:
[1 2 3 4 5]
我們也可以創(chuàng)建一個二維數(shù)組:
arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr)
輸出:
[[1 2 3]
[4 5 6]]
3.1 數(shù)組屬性
NumPy數(shù)組有許多重要的屬性,可以幫助我們了解數(shù)組的特征。
arr = np.array([1, 2, 3, 4, 5]) print("數(shù)組形狀:", arr.shape) print("數(shù)組維度:", arr.ndim) print("數(shù)組元素總數(shù):", arr.size) print("數(shù)組數(shù)據(jù)類型:", arr.dtype)
輸出:
數(shù)組形狀: (5,)
數(shù)組維度: 1
數(shù)組元素總數(shù): 5
數(shù)組數(shù)據(jù)類型: int32
3.2 數(shù)組操作
NumPy提供了許多數(shù)組操作的功能,例如數(shù)組索引、切片和形狀變換等。
arr = np.array([1, 2, 3, 4, 5]) print("第一個元素:", arr[0]) print("前兩個元素:", arr[:2]) print("倒數(shù)三個元素:", arr[-3:])
輸出:
第一個元素: 1
前兩個元素: [1 2]
倒數(shù)三個元素: [3 4 5]
3.3 數(shù)組運(yùn)算
NumPy支持對數(shù)組進(jìn)行基本的數(shù)學(xué)運(yùn)算,例如加法、減法、乘法和除法。
arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) print("加法:", arr1 + arr2) print("減法:", arr1 - arr2) print("乘法:", arr1 * arr2) print("除法:", arr1 / arr2)
輸出:
加法: [5 7 9]
減法: [-3 -3 -3]
乘法: [ 4 10 18]
除法: [0.25 0.4 0.5 ]
3.4 常用函數(shù)
NumPy還提供了許多常用的函數(shù),例如求和、平均值、最大值和最小值。
arr = np.array([1, 2, 3, 4, 5]) print("求和:", np.sum(arr)) print("平均值:", np.mean(arr)) print("最大值:", np.max(arr)) print("最小值:", np.min(arr))
輸出為:
求和: 15
平均值: 3.0
最大值: 5
最小值: 1
4. NumPy高級用法
4.1 廣播(Broadcasting)
NumPy數(shù)組廣播是一種自動執(zhí)行元素級操作的機(jī)制。它可以使具有不同形狀的數(shù)組在算術(shù)運(yùn)算中表現(xiàn)得像具有相同形狀的數(shù)組一樣。這種機(jī)制大大簡化了對不同形狀數(shù)組之間的操作。
下面是一個示例代碼,演示了如何使用廣播來執(zhí)行數(shù)組的加法運(yùn)算:
import numpy as np arr1 = np.array([[1, 2, 3], [4, 5, 6]]) arr2 = np.array([10, 20, 30]) result = arr1 + arr2 print(result)
在上面的代碼中,arr1
是一個形狀為 (2, 3) 的二維數(shù)組,arr2
是一個形狀為 (3,) 的一維數(shù)組。根據(jù)廣播規(guī)則,arr2
實際上被擴(kuò)展為了形狀為 (2, 3) 的二維數(shù)組,其中每一行都是 arr2
。然后,數(shù)組 arr1
和擴(kuò)展后的 arr2
進(jìn)行元素級加法運(yùn)算,得到了最終的結(jié)果。
輸出結(jié)果為:
[[11 22 33]
[14 25 36]]
通過廣播機(jī)制,我們可以直接對不同大小的數(shù)組執(zhí)行加法操作,而不需要手動進(jìn)行數(shù)組形狀的調(diào)整。這樣可以大大簡化代碼,并提高效率。同時,廣播機(jī)制也可以應(yīng)用于其他的 NumPy 函數(shù)和運(yùn)算中。
4.2 高級索引
NumPy提供了多種高級索引技巧,用于訪問數(shù)組的特定位置。以下是三種常用的高級索引方法:
- 整數(shù)數(shù)組索引:使用一個整數(shù)數(shù)組作為索引,可以選擇數(shù)組中的特定元素。
import numpy as np a = np.array([1, 2, 3, 4, 5]) # 使用整數(shù)數(shù)組索引獲取指定位置的元素 indices = np.array([1, 3]) result = a[indices] print(result)
輸出:
[2, 4]
- 布爾數(shù)組索引:使用一個布爾數(shù)組作為索引,可以根據(jù)布爾數(shù)組的元素值來選擇數(shù)組中的元素。
import numpy as np a = np.array([1, 2, 3, 4, 5]) # 使用布爾數(shù)組索引選擇大于3的元素 mask = a > 3 result = a[mask] print(result)
輸出:
[4, 5]
還可以按布爾數(shù)組進(jìn)行匹配
arr = np.array([1, 2, 3, 4, 5]) mask = np.array([True, False, True, False, True]) # 選擇為True的元素 print(arr[mask]) # 輸出 [1 3 5]
- 花式索引(Fancy indexing):使用整數(shù)數(shù)組或整數(shù)列表作為索引,可以根據(jù)指定的索引位置選擇數(shù)組中的元素。
import numpy as np a = np.array([1, 2, 3, 4, 5]) # 使用花式索引獲取指定位置的元素 indices = np.array([0, 2, 4]) result = a[indices] print(result)
輸出:
array([1, 3, 5])
多維數(shù)組的操作與此類似,如果有時間,不妨在上述例子上動手試一下,記住,如果使用負(fù)整數(shù),索引會從末尾倒著開始哦。
4.3 數(shù)組操作
NumPy提供了一些方便的函數(shù)來操作數(shù)組,包括連接數(shù)組、分割數(shù)組、改變數(shù)組形狀和交換數(shù)組維度等。
- 連接數(shù)組:使用
np.concatenate()
函數(shù)沿指定軸連接數(shù)組
import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 沿行方向連接數(shù)組 result = np.concatenate((a, b), axis=0) print(result)
輸出:
[[1, 2]
[3, 4]
[5, 6]
[7, 8]]
2. 分割數(shù)組:使用np.split()
函數(shù)將數(shù)組分割為多個子數(shù)組
import numpy as np a = np.array([1, 2, 3, 4, 5]) # 將數(shù)組分割為3個子數(shù)組 result = np.array_split(a, 3) print(result)
輸出:
[array([1, 2]), array([3, 4]), array([5])]
np.array_split()
是 NumPy 中用于將數(shù)組拆分成多個子數(shù)組的函數(shù)。它接受三個參數(shù):數(shù)組、拆分的位置或拆分的索引、拆分的軸。當(dāng)我們拆分多維數(shù)組時,又會發(fā)生什么呢?
import numpy as np # 創(chuàng)建一個數(shù)組 arr = np.arange(1, 13).reshape(3, 4) print("原始數(shù)組:") print(arr) # 對數(shù)組進(jìn)行拆分 sub_arrays = np.array_split(arr, 2, axis=1) print("\n拆分后的子數(shù)組:") for sub_arr in sub_arrays: print(sub_arr)
運(yùn)行這段代碼,輸出將是:
原始數(shù)組:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]拆分后的子數(shù)組:
[[ 1 2]
[ 5 6]
[ 9 10]]
[[ 3 4]
[ 7 8]
[11 12]]
wahoo,很明顯,拆分根據(jù)axis參數(shù),只獲取二維原始數(shù)組(2-D)中的前2列,即在原始二維數(shù)組arr的每個元素下標(biāo)為axis=1的位置停止了。
在這個示例中,我們創(chuàng)建了一個 3 行 4 列的數(shù)組 arr
,然后使用 np.array_split(arr, 2, axis=1)
將數(shù)組拆分成兩個子數(shù)組。拆分的結(jié)果是一個包含兩個數(shù)組的列表 sub_arrays
,要注意的是,拆分的軸參數(shù)axis是可選的。如果沒有提供軸參數(shù),np.array_split()
默認(rèn)在 0 軸(行)上進(jìn)行拆分。
- 改變數(shù)組形狀:使用
np.reshape()
函數(shù)改變數(shù)組的形狀
import numpy as np a = np.array([[1, 2, 3], [4, 5, 6]]) # 將數(shù)組轉(zhuǎn)換為2x3的形狀 result = np.reshape(a, (2, 3)) print(result)
輸出:
[[1, 2, 3]
[4, 5, 6]]
4. 交換數(shù)組維度:使用np.transpose()
函數(shù)交換數(shù)組的維度
import numpy as np a = np.array([[1, 2, 3], [4, 5, 6]]) # 交換數(shù)組的維度 result = np.transpose(a) print(result)
輸出:
[[1, 4]
[2, 5]
[3, 6]]
4.4 ufunc函數(shù)
ufunc(universal functions)是一種可以對數(shù)組進(jìn)行元素級運(yùn)算的函數(shù)。NumPy提供了許多ufunc函數(shù),如np.add()
、np.subtract()
、np.multiply()
和np.divide()
等。以下是一個簡單的示例:
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 對數(shù)組進(jìn)行元素級加法運(yùn)算 result = np.add(a, b) print(result)
輸出:
[5, 7, 9]
4.5 矩陣運(yùn)算
NumPy支持矩陣運(yùn)算,可以使用np.dot()
函數(shù)計算兩個數(shù)組的矩陣乘法。另外,np.linalg
模塊提供了一些常用的線性代數(shù)函數(shù),如計算逆矩陣、解線性方程組、計算特征值和特征向量等。以下是一個簡單的例子:
import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 計算兩個數(shù)組的矩陣乘法 result = np.dot(a, b) print(result)
輸出:
[[19, 22]
[43, 50]])
4.6 數(shù)組的高級排序
除了常規(guī)的排序方法外,NumPy還提供了一些高級的排序技巧。np.lexsort()
函數(shù)可以根據(jù)鍵的組合對多個數(shù)組進(jìn)行排序。np.argsort()
函數(shù)返回數(shù)組排序后的索引,而不是排序后的實際值。以下是一個簡單的示例:
import numpy as np a = np.array([3, 1, 2]) b = np.array([5, 4, 6]) # 根據(jù)a和b的值對數(shù)組進(jìn)行排序 indices = np.lexsort((b, a)) sorted_array = a[indices] print(sorted_array)
輸出:
[1, 2, 3]
np.lexsort
函數(shù)是 NumPy 中用于執(zhí)行間接排序的函數(shù)。它將根據(jù)給定的鍵序列對數(shù)組進(jìn)行排序,并返回排序后的索引。
具體來說,lexsort
函數(shù)使用鍵序列的最后一個鍵進(jìn)行排序,然后使用倒數(shù)第二個鍵進(jìn)行排序,以此類推,直到使用第一個鍵進(jìn)行排序。這樣,最終得到的索引序列將使數(shù)組按照鍵序列逐級排序。
讓我們通過一個示例來演示 lexsort
函數(shù)的用法:
import numpy as np # 創(chuàng)建一個包含姓名的字符串?dāng)?shù)組, names = np.array(['Alice', 'Bob', 'Charlie', 'David']) # 創(chuàng)建一個二維數(shù)組,分別代表上述學(xué)生的語文、數(shù)學(xué)、英語成績 scores = np.array([[70, 85, 90], [60, 75, 80], [80, 90, 85], [75, 80, 70]]) # 使用 lexsort 對數(shù)組進(jìn)行排序、按 sorted_indices = np.lexsort((scores[:, 1], scores[:, 2], scores[:, 0])) # 根據(jù)排序后的索引序列獲取排序后的數(shù)組和姓名 sorted_scores = scores[sorted_indices] sorted_names = names[sorted_indices] print("Sorted Scores:") print(sorted_scores) print("\nSorted Names:") print(sorted_names)
輸出結(jié)果為:
Sorted Scores:
[[60 75 80]
[70 85 90]
[75 80 70]
[80 90 85]]Sorted Names:
['Bob' 'Alice' 'David' 'Charlie']
在上面的示例中,我們使用 lexsort
函數(shù)根據(jù)每個學(xué)生的成績(先按照數(shù)學(xué)成績排序,然后按照英語成績排序,最后按照語文成績排序)對學(xué)生的記錄進(jìn)行排序。最后,我們根據(jù)排序后的索引序列獲取了排序后的數(shù)組和姓名。
5. 總結(jié)
NumPy是Python科學(xué)計算的核心庫之一,廣泛用于數(shù)據(jù)處理、統(tǒng)計分析和數(shù)值計算。
NumPy的高級用法能夠提高代碼的靈活性和效率,讓我們更方便地處理不同形狀的數(shù)組、獲取特定位置的元素,并對數(shù)組進(jìn)行各種操作。通過學(xué)習(xí)以上幾個高級用法,我們可以更好地利用NumPy進(jìn)行科學(xué)計算和數(shù)據(jù)處理。希望本教程對您有所幫助。
以上就是Python基礎(chǔ)教程之NumPy庫的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Python NumPy庫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python開發(fā)工具Pycharm的安裝以及使用步驟總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python開發(fā)工具的安裝以及使用的相關(guān)知識,文章圍繞著如何使用和安裝Pycharm展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Python之日期與時間處理模塊(date和datetime)
這篇文章主要介紹了Python之日期與時間處理模塊(date和datetime),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02python flask解析json數(shù)據(jù)不完整的解決方法
這篇文章主要介紹了python flask解析json數(shù)據(jù)不完整的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05Python技巧之實現(xiàn)批量統(tǒng)一圖片格式和尺寸
大家在工作的時候基本都會接觸到很多的圖片,有時為了不同的工作需求需要修改圖片的尺寸或者大小。本文為大家整理了Python批量轉(zhuǎn)換圖片格式和統(tǒng)一圖片尺寸,希望對大家有所幫助2023-05-05pandas去重復(fù)行并分類匯總的實現(xiàn)方法
這篇文章主要介紹了pandas去重復(fù)行并分類匯總的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01