NumPy 是 Python 中最受歡迎的第三方庫之一。本文將通過圖示和更具實踐性的方式介紹其使用方法,使你能夠通過直觀理解來加深記憶。
一、導(dǎo)入 NumPy
import numpy as np二、NumPy 數(shù)組的創(chuàng)建
NumPy 支持從列表、元組、字符串、緩沖區(qū)、迭代器等多種數(shù)據(jù)來源創(chuàng)建數(shù)組。
![]()
1、多種創(chuàng)建數(shù)組的方法
numpy.fromiter(iterable, dtype, count=-1) NumPy 提供了大量創(chuàng)建數(shù)組的方法。
2、查看數(shù)組結(jié)構(gòu)信息
NumPy 提供了一組數(shù)組屬性,用于描述數(shù)組的結(jié)構(gòu)信息;其中部分屬性可讀取結(jié)構(gòu)特征,個別屬性在滿足條件時還可用于調(diào)整結(jié)構(gòu)。
例如:
len(a) # 2 數(shù)組第 0 維(axis=0)的長度,相當(dāng)于 a.shape[0]3、快速創(chuàng)建 NumPy 數(shù)組的方法
np.full(shape,7) # 創(chuàng)建數(shù)組元素全是指定值的數(shù)組![]()
還可以創(chuàng)建包含隨機值的數(shù)組:
np.random.randn(3,2) # 創(chuàng)建標(biāo)準(zhǔn)正態(tài)分布的隨機數(shù)組![]()
還有更多實用的創(chuàng)建方法,比如,arange() 可用于創(chuàng)建一個等差序列數(shù)組。
np.arange(start, stop(不包含), step)示例:
# [13, 14, 15, 16]])三、算術(shù)運算
NumPy 支持多種算術(shù)運算(Arithmetic Operations):
? 同形狀的數(shù)組之間的逐元素運算
? 形狀滿足廣播規(guī)則時,數(shù)組之間可以自動擴展后再逐元素運算
? 標(biāo)量與數(shù)組的運算
![]()
a + 2其他運算方式類似。但需注意:參與運算的數(shù)組形狀必須滿足要求,這種機制稱為“廣播”(Broadcasting)。
NumPy 的廣播規(guī)則是:
? 維度不足時在左側(cè)補 1
? 從右向左逐維比較,每一維必須“相等或存在 1”
比如:
結(jié)果形狀 :(7, 3, 6, 5)而以下情形將不支持廣播運算,比如:
(3, 2) 與 (3, )![]()
NumPy 常用的二元算術(shù)運算函數(shù)有:
a.dot(b) # 對一維數(shù)組常表示向量點積;對二維數(shù)組常表示矩陣乘法![]()
NumPy 還提供了多個數(shù)學(xué)函數(shù)可以對數(shù)組中所有元素執(zhí)行向量化運算:
np.log(a) # 以 e 為底的對數(shù)四、索引與切片
基本索引(包括整數(shù)索引和切片訪問等)是 NumPy 中最基礎(chǔ)的數(shù)組訪問方式,其行為與 Python 序列類型(如列表、)的索引和切片規(guī)則基本一致。
整數(shù)索引的基本形式:
arr[index]切片訪問的基本形式:
arr[from:to:step, from:to:step, ...] 對于多維數(shù)組,NumPy 使用逗號分隔各個維度的索引。省略符(ellipsis) ... 可用于表示多個維度的全部元素。
![]()
示例:
# array([['T', 'H', 'O', 'T']], dtype=' )在 NumPy 的基本索引中,整數(shù)索引會消除該維度,而切片索引會保留該維度。
比如,上例中,site[0:1, 1] 中的 0:1 切片會返回一個同維數(shù)組 (1, 2, 4),當(dāng)再進行整數(shù)索引,第 1 維被消除,返回二維數(shù)組 (1, 4)。
![]()
site[0,1] 在各個維度上都使用整數(shù)索引,因此分別消除第 0 維和第 1 維,返回一維數(shù)組 (4, )。
![]()
NumPy 的基本索引同樣支持負索引與負步長。
![]()
示例:
site[:, :, ::-1] # 將最后一個軸上的元素逆序五、聚合運算
NumPy 提供了一組用于對數(shù)組元素進行統(tǒng)計匯總的函數(shù)。這些函數(shù)可以對整個數(shù)組進行聚合計算(也稱“歸約計算”),也可以通過 axis 參數(shù)沿指定軸進行統(tǒng)計,從而實現(xiàn)按行或按列計算。
比如:
a.mean() # 均值np.std(a) # 標(biāo)準(zhǔn)差1、Axis(軸)
聚合操作可以針對指定軸進行。
![]()
下面以三維數(shù)組的求和運算為例:
npr = np.array([1, 2, 4, 5, 7, 8, 1, 2, 4, 5, 7, 8]).reshape(2, 3, 2)(1)當(dāng)指定 axis = 0 時,沿第 0 軸方向求和,返回一個二維數(shù)組 (3, 2)。
npr.sum(axis=0)(2)當(dāng)指定 axis = 1 時,沿第 1 軸方向求和,返回一個二維數(shù)組 (2, 2)。
npr.sum(axis=1)(3)當(dāng)指定 axis = 2 時,沿第 2 軸方向求和,返回一個二維數(shù)組 (2, 3)。
npr.sum(axis=2)![]()
對三維數(shù)組求最大值也是如此:
npr.max(axis=2)![]()
六、數(shù)組重構(gòu)
1、結(jié)構(gòu)重構(gòu)
常用的數(shù)組結(jié)構(gòu)重構(gòu)方法有:
? .reshape():改變形狀(返回新數(shù)組)
? .resize():原地修改數(shù)組形狀;若新數(shù)組更大,新增部分通常以 0 填充;若更小,則截斷數(shù)據(jù)
? .T:轉(zhuǎn)置(Transpose)。對二維數(shù)組表現(xiàn)為行列互換;對更高維數(shù)組則是將各軸順序反轉(zhuǎn)
? .ravel():展平為一維數(shù)組
![]()
2、拼接數(shù)組
可以使用多種方式拼接數(shù)組。
? np.concatenate():沿指定軸拼接多個數(shù)組
? np.append():將值追加到數(shù)組(默認先展平),返回新數(shù)組
![]()
3、插入與刪除
對于二維數(shù)組:
? axis=0 表示行
? axis=1 表示列
插入示例:
print(a)輸出:
[7 8 9]]在該示例下,插入值可以是標(biāo)量 9,也可以是形狀匹配的一維序列 [9, 9, 9];是否可插入其他形狀,還取決于 axis 與廣播兼容性。
![]()
![]()
刪除示例:
a == a3輸出:
[ True, True, True]])若需單個布爾值:
np.array_equal(a, a3) # True4、排序
排序操作既可以作用于整個數(shù)組,也可以僅作用于指定軸。
.sort() 默認沿 axis = -1(最后一個軸)升序排序,并原地修改數(shù)組。
示例:
a.sort(axis=0)5、關(guān)于“拷貝”
NumPy 中的“復(fù)制”涉及數(shù)據(jù)緩沖區(qū)與數(shù)組結(jié)構(gòu)兩個層面。變量賦值僅創(chuàng)建引用;切片與 view 通常生成共享數(shù)據(jù)的視圖;而 copy() 等操作才會復(fù)制底層數(shù)據(jù)。理解這些機制,有助于避免隱式數(shù)據(jù)修改,并提升數(shù)組計算的效率。
七、高級索引
NumPy 可以使用布爾數(shù)組索引、整數(shù)數(shù)組索引以及混合索引來選擇元素。
![]()
1、布爾數(shù)組篩選
(1)條件篩選
# array([1, 2, 3, 4, 5, 6])先計算條件表達式 a < 7,得到布爾矩陣,True 位置對應(yīng)的元素被選出,返回結(jié)果為一維扁平數(shù)組。這是對普通布爾數(shù)組篩選而言的常見結(jié)果形式。
(2)條件排除
# array([ 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16])選出所有不等于 7 的元素,同樣返回一維扁平數(shù)組。
2、整數(shù)數(shù)組索引
(1)行索引
a[[1, 0, 1, 2]]這實際上是在按給定順序選取第 1、0、1、2 行,可重復(fù)選取。
(2)列重排
a[:, [1, 0, 1, 2]]選取列并重排序,可重復(fù)列。
3、組合坐標(biāo)式索引
a[[1, 0, 2], [0, 1, 0]]按坐標(biāo)對選取元素,返回一維數(shù)組。
小結(jié)
本文以圖示方式介紹了 NumPy 數(shù)組的創(chuàng)建、運算、索引、聚合與重構(gòu)等基礎(chǔ)內(nèi)容。學(xué)習(xí)時應(yīng)特別注意廣播規(guī)則、軸的含義以及視圖與拷貝的區(qū)別,這些機制是正確使用 NumPy 的關(guān)鍵。
特別聲明:
除延伸閱讀文章之外,本文的基本框架、示例及所有圖片來自以下網(wǎng)址,感謝原作者的辛勤工作。
https://solothought.com/tutorial/python-numpy“點贊有美意,贊賞是鼓勵”
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.