Python中NumPy庫的核心知識總結(jié)大全
一、核心對象:ndarray(N維數(shù)組)
1.1 定義與特點
- ndarray:存儲同類型元素的多維容器,所有元素必須是同一數(shù)據(jù)類型(同構(gòu)性),這是其高性能的基礎(chǔ)。
- 與 Python 列表的區(qū)別:
- 列表可存儲不同類型元素,而
ndarray元素類型統(tǒng)一。 - 列表不支持向量化運算(如
list1 + list2是拼接,而非元素相加),ndarray支持。
- 列表可存儲不同類型元素,而
1.2 核心屬性
| 屬性 | 描述 | 示例(arr = np.array([[1,2],[3,4]])) |
|---|---|---|
shape | 數(shù)組維度的元組,格式為 (維度1大小, 維度2大小, ...) | (2, 2)(2 行 2 列) |
dtype | 元素的數(shù)據(jù)類型(如 int32、float64) | int64(默認整數(shù)類型) |
ndim | 數(shù)組的維度數(shù)(秩) | 2(二維數(shù)組) |
size | 數(shù)組元素的總個數(shù)(shape 各元素乘積) | 4(2×2) |
itemsize | 單個元素的字節(jié)大小 | 8(int64 占 8 字節(jié)) |
nbytes | 數(shù)組總字節(jié)大小(size × itemsize) | 32(4×8) |
data | 指向數(shù)組數(shù)據(jù)的緩沖區(qū)(一般不直接使用) | 內(nèi)存地址指針 |
示例:
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.shape) # (2, 3) print(arr.dtype) # int64 print(arr.ndim) # 2 print(arr.size) # 6
二、數(shù)組創(chuàng)建方法
2.1 從 Python 序列創(chuàng)建
- 基礎(chǔ)語法:
np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)object:輸入序列(列表、元組等)。dtype:指定數(shù)據(jù)類型(如np.int32、np.float64),不指定則自動推斷。ndmin:指定最小維度數(shù)(不足則補維度)。
示例:
# 1維數(shù)組 arr1 = np.array([1, 2, 3, 4]) # 2維數(shù)組(列表嵌套列表) arr2 = np.array([[1, 2], [3, 4]], dtype=np.float32) # 指定為32位浮點數(shù) # 強制為3維數(shù)組(即使輸入是2維) arr3 = np.array([[1, 2], [3, 4]], ndmin=3) # shape 為 (1, 2, 2)
2.2 創(chuàng)建特殊數(shù)組
| 函數(shù) | 描述 | 示例 |
|---|---|---|
np.zeros(shape) | 創(chuàng)建全 0 數(shù)組 | np.zeros((2,3)) → 2 行 3 列全 0 數(shù)組 |
np.ones(shape) | 創(chuàng)建全 1 數(shù)組 | np.ones(5) → 1 維 5 元素全 1 數(shù)組 |
np.full(shape, val) | 創(chuàng)建填充指定值 val 的數(shù)組 | np.full((2,2), 10) → 2×2 全 10 數(shù)組 |
np.empty(shape) | 創(chuàng)建未初始化數(shù)組(值為內(nèi)存隨機值,速度快) | np.empty((3,3)) |
np.arange(start, stop, step) | 生成整數(shù)序列(類似 range,但返回數(shù)組),start 默認為 0,step默認為 1 | np.arange(1, 10, 2) → [1,3,5,7,9] |
np.linspace(start, stop, num) | 生成 num 個等間隔的數(shù)(包含 start 和 stop) | np.linspace(0, 1, 5) → [0,0.25,0.5,0.75,1] |
np.eye(n, k=0) | 創(chuàng)建 n×n 單位矩陣(對角線為 1,其余為 0),k 控制對角線偏移(正上負下) | np.eye(3, k=1) → 上對角線為 1 |
np.diag(arr) | 從 1 維數(shù)組創(chuàng)建對角矩陣,或從多維數(shù)組提取對角線 | np.diag([1,2,3]) → 3×3 對角矩陣 |
2.3 隨機數(shù)組(np.random模塊)
| 函數(shù) | 描述 |
|---|---|
np.random.rand(d0, d1, ...) | 生成 [0,1) 均勻分布的隨機數(shù)數(shù)組 |
np.random.randn(d0, d1, ...) | 生成標準正態(tài)分布(均值 0,方差 1)的隨機數(shù)數(shù)組 |
np.random.randint(low, high, size) | 生成 [low, high) 范圍內(nèi)的隨機整數(shù)數(shù)組 |
np.random.choice(arr, size) | 從 arr 中隨機采樣生成數(shù)組 |
np.random.shuffle(arr) | 原地打亂數(shù)組順序(僅對第一維有效) |
示例:
np.random.rand(2, 3) # 2行3列 [0,1) 隨機數(shù) np.random.randint(1, 10, size=(3,)) # 1維3元素,值在1~9之間
三、數(shù)組操作(維度與形態(tài))
3.1 維度調(diào)整
reshape(shape):返回一個新數(shù)組,維度為shape,原數(shù)組不變(需滿足size一致)。
arr = np.arange(12) # shape (12,) arr_reshape = arr.reshape(3, 4) # shape (3,4),元素不變
- flatten() vs ravel():均將數(shù)組降為 1 維,區(qū)別在于:
flatten():返回原數(shù)組的副本(修改新數(shù)組不影響原數(shù)組)。ravel():返回原數(shù)組的視圖(修改新數(shù)組會影響原數(shù)組,內(nèi)存效率更高)。
arr = np.array([[1,2],[3,4]]) arr_flat = arr.flatten() # 副本 arr_rav = arr.ravel() # 視圖
newaxis:為數(shù)組增加一個維度(常用于廣播或匹配維度)。
arr = np.array([1,2,3]) # shape (3,) arr_2d = arr[np.newaxis, :] # shape (1,3)(行向量) arr_2d_col = arr[:, np.newaxis] # shape (3,1)(列向量)
3.2 數(shù)組拼接
np.concatenate(arrays, axis=0):沿指定軸拼接多個數(shù)組(要求除拼接軸外,其他維度大小一致)。axis=0:垂直拼接(行方向),axis=1:水平拼接(列方向)。
- 簡化函數(shù):
np.vstack(tup):垂直拼接(等價于concatenate(tup, axis=0))。np.hstack(tup):水平拼接(等價于concatenate(tup, axis=1))。np.dstack(tup):深度拼接(沿第三維,適合 3D 數(shù)組)。
示例:
a = np.array([[1,2], [3,4]]) # shape (2,2) b = np.array([[5,6], [7,8]]) # shape (2,2) np.concatenate([a, b], axis=0) # 垂直拼接 → shape (4,2) np.hstack([a, b]) # 水平拼接 → shape (2,4)
3.3 數(shù)組分割
np.split(ary, indices_or_sections, axis=0):沿指定軸分割數(shù)組。indices_or_sections:若為整數(shù)n,則平均分成n份;若為列表,則按索引分割。
- 簡化函數(shù):
np.vsplit(垂直分割)、np.hsplit(水平分割)、np.dsplit(深度分割)。
示例:
arr = np.arange(12).reshape(3,4) # shape (3,4) # 按索引分割(axis=0,行方向) np.split(arr, [1,3], axis=0) # 分割為 [0:1行, 1:3行] # 平均分成2份(axis=1,列方向) np.hsplit(arr, 2) # 分割為 [0:2列, 2:4列]
3.4 轉(zhuǎn)置與軸交換
arr.T:數(shù)組轉(zhuǎn)置(適用于 2D 數(shù)組,行變列、列變行)。arr.transpose(*axes):自定義軸的順序(多維數(shù)組常用)。
arr = np.arange(8).reshape(2,2,2) # shape (2,2,2) arr_trans = arr.transpose(1,0,2) # 交換0軸和1軸,新shape (2,2,2)
四、索引與切片(元素訪問)
NumPy 支持多種索引方式,用于精準訪問數(shù)組元素。
4.1 基本索引(單元素訪問)
- 多維數(shù)組用逗號分隔各維度索引:
arr[dim0_idx, dim1_idx, ...]。 - 索引從 0 開始,支持負索引(-1 表示最后一個元素)。
示例:
arr = np.array([[1,2,3], [4,5,6], [7,8,9]]) # 3×3數(shù)組 print(arr[0, 1]) # 第0行第1列 → 2 print(arr[2, -1]) # 第2行最后一列 → 9
4.2 切片(范圍訪問)
- 語法:
start:end:step(start默認為 0,end默認為維度大小,step默認為 1)。 - 多維切片:各維度切片用逗號分隔,
:表示取該維度所有元素。
示例:
arr = np.arange(12).reshape(3,4) # 3行4列:[[0,1,2,3],[4,5,6,7],[8,9,10,11]] # 取第1行(索引0)的第1到第3列(不包含3) print(arr[0, 1:3]) # [1,2] # 取第0到第2行(不包含2)的所有列 print(arr[0:2, :]) # [[0,1,2,3], [4,5,6,7]] # 每隔1行取1行,每隔2列取1列 print(arr[::2, ::2]) # [[0,2], [8,10]]
4.3 布爾索引(條件篩選)
- 用布爾數(shù)組(與原數(shù)組同 shape)篩選元素,結(jié)果為滿足條件的元素組成的 1 維數(shù)組。
示例:
arr = np.array([[1,2,3], [4,5,6], [7,8,9]]) # 篩選大于5的元素 mask = arr > 5 # 布爾數(shù)組:[[False,False,False], [False,False,True], [True,True,True]] print(arr[mask]) # [6,7,8,9] # 復(fù)合條件(需用 & 連接,而非 and) print(arr[(arr > 3) & (arr < 8)]) # [4,5,6,7]
4.4 花式索引(指定位置訪問)
- 用整數(shù)數(shù)組(列表)指定需要訪問的索引,結(jié)果為對應(yīng)位置元素組成的新數(shù)組。
示例:
arr = np.array([10, 20, 30, 40, 50]) # 1維數(shù)組:取索引0, 2, 4的元素 print(arr[[0, 2, 4]]) # [10,30,50] # 2維數(shù)組:取 (0,1)、(2,3) 位置的元素 arr2d = np.arange(12).reshape(3,4) print(arr2d[[0,2], [1,3]]) # [1, 11]
注意:
- 切片返回的是原數(shù)組的視圖(修改會影響原數(shù)組)。
- 布爾索引和花式索引返回的是副本(修改不影響原數(shù)組)。
五、廣播機制(Broadcasting)
廣播是 NumPy 中不同形狀數(shù)組進行算術(shù)運算的核心機制,無需手動擴展數(shù)組維度。
5.1 廣播規(guī)則
- 維度對齊:若兩個數(shù)組維度不同,在形狀較短的數(shù)組前補 1,直到維度數(shù)相同。
- 例:
shape (2,3)與shape (3,)→ 補 1 后為(2,3)與(1,3)。
- 例:
- 維度兼容:對于對齊后的每個維度,若大小相同,或其中一個為 1,則兼容;否則報錯。
- 兼容示例:
(2,3)與(1,3)→ 第 0 維 2 vs 1(兼容),第 1 維 3 vs 3(兼容)。 - 不兼容示例:
(2,3)與(2,4)→ 第 1 維 3 vs 4(不兼容,報錯)。
- 兼容示例:
- 擴展維度:兼容的維度中,大小為 1 的維度會被擴展為與另一個數(shù)組相同的大?。ㄌ摂M擴展,不占用內(nèi)存)。
5.2 廣播示例
# 示例1:1維數(shù)組與標量廣播 a = np.array([1, 2, 3]) b = 2 print(a + b) # [3,4,5](b 廣播為 [2,2,2]) # 示例2:2維數(shù)組與1維數(shù)組廣播 a = np.array([[1,2,3], [4,5,6]]) # shape (2,3) b = np.array([10, 20, 30]) # shape (3,) → 廣播為 (1,3) → 再擴展為 (2,3) print(a + b) # [[11,22,33], [14,25,36]] # 示例3:高維廣播 a = np.ones((2, 1, 3)) # shape (2,1,3) b = np.ones((1, 2, 3)) # shape (1,2,3) # 對齊維度后:(2,1,3) 與 (1,2,3) → 擴展為 (2,2,3) print((a + b).shape) # (2,2,3)
六、數(shù)學(xué)運算
6.1 元素級運算
支持 +、-、*、/、**(冪)、%(取模)等運算符,或?qū)?yīng)的函數(shù)(如 np.add)。
示例:
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a + b) # [5,7,9](元素相加) print(a * b) # [4,10,18](元素相乘) print(a **2) # [1,4,9](元素平方) print(np.subtract(b, a)) # [3,3,3](等價于 b - a)
6.2 聚合函數(shù)(沿軸運算)
對數(shù)組沿指定軸(axis)進行統(tǒng)計或聚合,返回標量或降維數(shù)組。
| 函數(shù) | 描述 | 示例(arr = np.array([[1,2],[3,4]])) |
|---|---|---|
np.sum(arr, axis) | 求和 | np.sum(arr, axis=0) → [4,6](按列求和) |
np.mean(arr, axis) | 均值 | np.mean(arr) → 2.5(全局均值) |
np.median(arr, axis) | 中位數(shù) | np.median(arr, axis=1) → [1.5, 3.5](按行求中位數(shù)) |
np.max(arr, axis) / np.min(arr, axis) | 最大 / 最小值 | np.max(arr, axis=0) → [3,4] |
np.std(arr, axis) / np.var(arr, axis) | 標準差 / 方差 | np.std(arr) → ~1.118 |
np.cumsum(arr, axis) | 累積和 | np.cumsum(arr) → [1,3,6,10] |
注意:axis 不指定時,默認對全局所有元素運算。
6.3 矩陣運算
-** 矩陣乘法 **:np.dot(a, b) 或 a @ b(要求 a 的列數(shù) = b 的行數(shù))。
a = np.array([[1,2], [3,4]]) # 2×2矩陣 b = np.array([[5,6], [7,8]]) # 2×2矩陣 print(a @ b) # 等價于 np.dot(a,b) → [[19,22], [43,50]]
-** 矩陣轉(zhuǎn)置 :a.T(行變列,列變行)。
- 其他矩陣函數(shù) **:np.linalg.inv(a)(矩陣求逆)、np.linalg.det(a)(行列式)、np.linalg.eig(a)(特征值和特征向量)等。
七、數(shù)據(jù)類型(dtype)與轉(zhuǎn)換
7.1 常用數(shù)據(jù)類型
NumPy 支持比 Python 更多的數(shù)據(jù)類型,常見類型如下:
| 類型 | 描述 | 示例 |
|---|---|---|
int8/int16/int32/int64 | 有符號整數(shù)(8/16/32/64 位) | np.int32 |
uint8/uint16... | 無符號整數(shù)(僅正整數(shù)) | np.uint8 |
float16/float32/float64 | 浮點數(shù)(精度遞增) | np.float64(默認) |
complex64/complex128 | 復(fù)數(shù)(實部 + 虛部) | np.complex128 |
bool | 布爾值(True/False) | np.bool_ |
string_ | 字符串(固定長度) | np.string_ |
7.2 數(shù)據(jù)類型轉(zhuǎn)換
- 用
arr.astype(dtype)轉(zhuǎn)換,返回新數(shù)組(原數(shù)組不變)。
示例:
arr = np.array([1, 2, 3], dtype=np.int32) arr_float = arr.astype(np.float64) # 轉(zhuǎn)為float64 → [1. 2. 3.] arr_str = arr.astype(np.string_) # 轉(zhuǎn)為字符串 → [b'1' b'2' b'3']
總結(jié)
到此這篇關(guān)于Python中NumPy庫核心知識總結(jié)大全的文章就介紹到這了,更多相關(guān)Python NumPy庫核心知識內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中的Numpy入門教程
- Python機器學(xué)習(xí)工具scikit-learn的使用筆記
- Python自然語言處理使用spaCy庫進行文本預(yù)處理
- Python機器學(xué)習(xí)庫sklearn(scikit-learn)的基礎(chǔ)知識和高級用法
- Python使用Transformers實現(xiàn)機器翻譯功能
- Python?langchain?ReAct?使用范例詳解
- Python spaCy 庫(NLP處理庫)的基礎(chǔ)知識詳解
- Python使用Whisper + Transformers自動生成中英文雙語字幕的完整流程
- 一文帶你搞懂Python?FastAPI中所有核心參數(shù)的設(shè)置
- 全面解析Python中的Scikit-learn強大工具
- Python與數(shù)據(jù)科學(xué)工具鏈之NumPy、Pandas、Matplotlib快速上手教程
- 2026年最值得投入學(xué)習(xí)的PythonAI框架top10排行榜
相關(guān)文章
Python 創(chuàng)建TCP服務(wù)器的方法
這篇文章主要介紹了Python 創(chuàng)建TCP服務(wù)器的方法,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
簡單介紹Python中的filter和lambda函數(shù)的使用
這篇文章主要簡單介紹了Python中的filter和lambda函數(shù)的使用,是Python學(xué)習(xí)中的基礎(chǔ),同時lambda匿名函數(shù)的使用也是經(jīng)常被用來對比各種編程語的重要特性,言需要的朋友可以參考下2015-04-04
Django在admin后臺集成TinyMCE富文本編輯器的例子
今天小編就為大家分享一篇Django在admin后臺集成TinyMCE富文本編輯器的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
使用Jest?在?Visual?Studio?Code?中進行單元測試的流程分析
Jest是一個流行的JavaScript測試框架,它提供了簡潔、靈活和強大的工具來編寫和運行單元測試,今天通過本文給大家介紹使用Jest在Visual Studio Code中進行單元測試的流程分析,感興趣的朋友跟隨小編一起看看吧2023-07-07

