Python基礎(chǔ)教程之NumPy庫的使用詳解
1. 為什么要學(xué)習(xí)NumPy?
NumPy(Numerical Python)是一個(gè)用于處理數(shù)組的Python庫,學(xué)習(xí)機(jī)器學(xué)習(xí)的過程中先學(xué)會(huì)使用NumPy是非常重要的,為什么要學(xué)習(xí)NumPy呢?原因如下:
數(shù)組操作和運(yùn)算:NumPy提供了高效的數(shù)組操作和數(shù)學(xué)運(yùn)算功能,這對(duì)于處理和轉(zhuǎn)換數(shù)據(jù)是至關(guān)重要的。在機(jī)器學(xué)習(xí)中,你經(jīng)常需要對(duì)數(shù)據(jù)進(jìn)行處理、轉(zhuǎn)換和重塑,使用NumPy可以方便地進(jìn)行這些操作。
高性能計(jì)算:NumPy是基于C語言實(shí)現(xiàn)的,它的計(jì)算效率非常高。在機(jī)器學(xué)習(xí)中,處理大規(guī)模的數(shù)據(jù)和進(jìn)行復(fù)雜的數(shù)學(xué)計(jì)算是很常見的。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é)會(huì)使用NumPy可以幫助你更好地理解和使用這些庫和框架,以便更好地進(jìn)行機(jī)器學(xué)習(xí)任務(wù)。
綜上所述,學(xué)習(xí)機(jī)器學(xué)習(xí)之前先學(xué)會(huì)使用NumPy是為了更好地處理和處理數(shù)據(jù)、進(jìn)行高性能計(jì)算,并為后續(xù)學(xué)習(xí)和使用其他機(jī)器學(xué)習(xí)庫打下堅(jiān)實(shí)的基礎(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)建一個(gè)一維數(shù)組:
arr = np.array([1, 2, 3, 4, 5]) print(arr)
輸出:
[1 2 3 4 5]
我們也可以創(chuàng)建一個(gè)二維數(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("第一個(gè)元素:", arr[0]) print("前兩個(gè)元素:", arr[:2]) print("倒數(shù)三個(gè)元素:", arr[-3:])
輸出:
第一個(gè)元素: 1
前兩個(gè)元素: [1 2]
倒數(shù)三個(gè)元素: [3 4 5]
3.3 數(shù)組運(yùn)算
NumPy支持對(duì)數(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高級(jí)用法
4.1 廣播(Broadcasting)
NumPy數(shù)組廣播是一種自動(dòng)執(zhí)行元素級(jí)操作的機(jī)制。它可以使具有不同形狀的數(shù)組在算術(shù)運(yùn)算中表現(xiàn)得像具有相同形狀的數(shù)組一樣。這種機(jī)制大大簡(jiǎn)化了對(duì)不同形狀數(shù)組之間的操作。
下面是一個(gè)示例代碼,演示了如何使用廣播來執(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
是一個(gè)形狀為 (2, 3) 的二維數(shù)組,arr2
是一個(gè)形狀為 (3,) 的一維數(shù)組。根據(jù)廣播規(guī)則,arr2
實(shí)際上被擴(kuò)展為了形狀為 (2, 3) 的二維數(shù)組,其中每一行都是 arr2
。然后,數(shù)組 arr1
和擴(kuò)展后的 arr2
進(jìn)行元素級(jí)加法運(yùn)算,得到了最終的結(jié)果。
輸出結(jié)果為:
[[11 22 33]
[14 25 36]]
通過廣播機(jī)制,我們可以直接對(duì)不同大小的數(shù)組執(zhí)行加法操作,而不需要手動(dòng)進(jìn)行數(shù)組形狀的調(diào)整。這樣可以大大簡(jiǎn)化代碼,并提高效率。同時(shí),廣播機(jī)制也可以應(yīng)用于其他的 NumPy 函數(shù)和運(yùn)算中。
4.2 高級(jí)索引
NumPy提供了多種高級(jí)索引技巧,用于訪問數(shù)組的特定位置。以下是三種常用的高級(jí)索引方法:
- 整數(shù)數(shù)組索引:使用一個(gè)整數(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ù)組索引:使用一個(gè)布爾數(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ù)組的操作與此類似,如果有時(shí)間,不妨在上述例子上動(dòng)手試一下,記住,如果使用負(fù)整數(shù),索引會(huì)從末尾倒著開始哦。
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ù)組分割為多個(gè)子數(shù)組
import numpy as np a = np.array([1, 2, 3, 4, 5]) # 將數(shù)組分割為3個(gè)子數(shù)組 result = np.array_split(a, 3) print(result)
輸出:
[array([1, 2]), array([3, 4]), array([5])]
np.array_split()
是 NumPy 中用于將數(shù)組拆分成多個(gè)子數(shù)組的函數(shù)。它接受三個(gè)參數(shù):數(shù)組、拆分的位置或拆分的索引、拆分的軸。當(dāng)我們拆分多維數(shù)組時(shí),又會(huì)發(fā)生什么呢?
import numpy as np # 創(chuàng)建一個(gè)數(shù)組 arr = np.arange(1, 13).reshape(3, 4) print("原始數(shù)組:") print(arr) # 對(duì)數(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的每個(gè)元素下標(biāo)為axis=1的位置停止了。
在這個(gè)示例中,我們創(chuàng)建了一個(gè) 3 行 4 列的數(shù)組 arr
,然后使用 np.array_split(arr, 2, axis=1)
將數(shù)組拆分成兩個(gè)子數(shù)組。拆分的結(jié)果是一個(gè)包含兩個(gè)數(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)是一種可以對(duì)數(shù)組進(jìn)行元素級(jí)運(yùn)算的函數(shù)。NumPy提供了許多ufunc函數(shù),如np.add()
、np.subtract()
、np.multiply()
和np.divide()
等。以下是一個(gè)簡(jiǎn)單的示例:
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 對(duì)數(shù)組進(jìn)行元素級(jí)加法運(yùn)算 result = np.add(a, b) print(result)
輸出:
[5, 7, 9]
4.5 矩陣運(yùn)算
NumPy支持矩陣運(yùn)算,可以使用np.dot()
函數(shù)計(jì)算兩個(gè)數(shù)組的矩陣乘法。另外,np.linalg
模塊提供了一些常用的線性代數(shù)函數(shù),如計(jì)算逆矩陣、解線性方程組、計(jì)算特征值和特征向量等。以下是一個(gè)簡(jiǎn)單的例子:
import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 計(jì)算兩個(gè)數(shù)組的矩陣乘法 result = np.dot(a, b) print(result)
輸出:
[[19, 22]
[43, 50]])
4.6 數(shù)組的高級(jí)排序
除了常規(guī)的排序方法外,NumPy還提供了一些高級(jí)的排序技巧。np.lexsort()
函數(shù)可以根據(jù)鍵的組合對(duì)多個(gè)數(shù)組進(jìn)行排序。np.argsort()
函數(shù)返回?cái)?shù)組排序后的索引,而不是排序后的實(shí)際值。以下是一個(gè)簡(jiǎn)單的示例:
import numpy as np a = np.array([3, 1, 2]) b = np.array([5, 4, 6]) # 根據(jù)a和b的值對(duì)數(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ù)給定的鍵序列對(duì)數(shù)組進(jìn)行排序,并返回排序后的索引。
具體來說,lexsort
函數(shù)使用鍵序列的最后一個(gè)鍵進(jìn)行排序,然后使用倒數(shù)第二個(gè)鍵進(jìn)行排序,以此類推,直到使用第一個(gè)鍵進(jìn)行排序。這樣,最終得到的索引序列將使數(shù)組按照鍵序列逐級(jí)排序。
讓我們通過一個(gè)示例來演示 lexsort
函數(shù)的用法:
import numpy as np # 創(chuàng)建一個(gè)包含姓名的字符串?dāng)?shù)組, names = np.array(['Alice', 'Bob', 'Charlie', 'David']) # 創(chuàng)建一個(gè)二維數(shù)組,分別代表上述學(xué)生的語文、數(shù)學(xué)、英語成績(jī) scores = np.array([[70, 85, 90], [60, 75, 80], [80, 90, 85], [75, 80, 70]]) # 使用 lexsort 對(duì)數(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ù)每個(gè)學(xué)生的成績(jī)(先按照數(shù)學(xué)成績(jī)排序,然后按照英語成績(jī)排序,最后按照語文成績(jī)排序)對(duì)學(xué)生的記錄進(jìn)行排序。最后,我們根據(jù)排序后的索引序列獲取了排序后的數(shù)組和姓名。
5. 總結(jié)
NumPy是Python科學(xué)計(jì)算的核心庫之一,廣泛用于數(shù)據(jù)處理、統(tǒng)計(jì)分析和數(shù)值計(jì)算。
NumPy的高級(jí)用法能夠提高代碼的靈活性和效率,讓我們更方便地處理不同形狀的數(shù)組、獲取特定位置的元素,并對(duì)數(shù)組進(jìn)行各種操作。通過學(xué)習(xí)以上幾個(gè)高級(jí)用法,我們可以更好地利用NumPy進(jìn)行科學(xué)計(jì)算和數(shù)據(jù)處理。希望本教程對(duì)您有所幫助。
以上就是Python基礎(chǔ)教程之NumPy庫的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Python NumPy庫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python開發(fā)工具Pycharm的安裝以及使用步驟總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python開發(fā)工具的安裝以及使用的相關(guān)知識(shí),文章圍繞著如何使用和安裝Pycharm展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06flask框架實(shí)現(xiàn)修改密碼和免密登錄功能
flask是python web開發(fā)的常用框架之一。本文將講述flask如何實(shí)現(xiàn)修改密碼和免密登錄功能2021-05-05Python之日期與時(shí)間處理模塊(date和datetime)
這篇文章主要介紹了Python之日期與時(shí)間處理模塊(date和datetime),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02python flask解析json數(shù)據(jù)不完整的解決方法
這篇文章主要介紹了python flask解析json數(shù)據(jù)不完整的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05Python技巧之實(shí)現(xiàn)批量統(tǒng)一圖片格式和尺寸
大家在工作的時(shí)候基本都會(huì)接觸到很多的圖片,有時(shí)為了不同的工作需求需要修改圖片的尺寸或者大小。本文為大家整理了Python批量轉(zhuǎn)換圖片格式和統(tǒng)一圖片尺寸,希望對(duì)大家有所幫助2023-05-05python tiktoken的簡(jiǎn)介、安裝、使用方法
tiktoken是OpenAI于近期開源的Python第三方模塊,該模塊主要實(shí)現(xiàn)了tokenizer的BPE(Byte pair encoding)算法,并對(duì)運(yùn)行性能做了極大的優(yōu)化,本文將介紹python tiktoken的簡(jiǎn)介、安裝、使用方法,感興趣的朋友跟隨小編一起看看吧2023-10-10pandas去重復(fù)行并分類匯總的實(shí)現(xiàn)方法
這篇文章主要介紹了pandas去重復(fù)行并分類匯總的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01