如何進行優(yōu)化短視頻關(guān)鍵詞優(yōu)化
【Python 零基礎(chǔ)入門】第六課 Numpy
- 概述
- 什么是 Numpy?
- Numpy 與 Python 數(shù)組的區(qū)別
- 并發(fā) vs 并行
- 單線程 vs 多線程
- GIL
- Numpy 在數(shù)據(jù)科學中的重要性
- Numpy 安裝
- Anaconda
- 導包
- ndarray
- np.array 創(chuàng)建
- 數(shù)組屬性
- np.zeros 創(chuàng)建
- np.ones 創(chuàng)建
- 數(shù)組的切片和索引
- 基本索引
- 切片操作
- 數(shù)組運算
- 常用函數(shù)
- reshape
- flatten
- 聚合函數(shù)
- Numpy 的高級功能
- 廣播
- 矩陣計算
- Numpy 實際應(yīng)用
- 統(tǒng)計分析
- 圖像處理
- 解方程
- 結(jié)論
- 練習
- 練習1
- 練習2
- 練習3
- 參考答案
- 練習1
- 練習2
- 練習3
概述
在眾多 Python 的數(shù)據(jù)處理庫中, Numpy 是一個非常強大的存在. Numpy 為我們提供了高性能的多維數(shù)組, 以及這些數(shù)組對象上的各種操作. 但是, 作為一個剛?cè)腴T Python 的新手, 你可能會問: "為什么我需要 Numpy, 而不是直接使用Python 的內(nèi)置列表?"在這篇文章的開篇, 我們就來探討這個問題.
什么是 Numpy?
Numpy (Numerical Python) 是 Python 非常重要的一個庫, 用于處理數(shù)值數(shù)組. Numpy 為我們提供了大量數(shù)據(jù)處理的函數(shù)以及數(shù)學函數(shù). 與 Python 的內(nèi)列表相比, Numpy 數(shù)組在數(shù)據(jù)分析, 科學計算, 線性代數(shù), 機器學習等方面都表現(xiàn)出了卓越的性能和效率.
Numpy 與 Python 數(shù)組的區(qū)別
雖然 Python 的內(nèi)置列表很靈活, 能存儲任意類型的數(shù)據(jù). 但當我們需要進行大量的數(shù)值運算時 (線性代數(shù), 統(tǒng)計), Python 的內(nèi)置列表效率并不高. Numpy 數(shù)組相比之下, 是在連續(xù)的內(nèi)存塊上存儲的, 這使得訪問速度更快, 效率更高. 而且 Numpy 是用 C 語言編寫的, 其內(nèi)部迭代計算比 Python 的內(nèi)置循環(huán)要快很多.
例子:
并發(fā) vs 并行
并發(fā) vs 并行
- 并發(fā) (Concurrency): 是指系統(tǒng)能夠處理多個任務(wù)在同一時間段內(nèi)交替執(zhí)行, 但不一定同時
- 并行 (Parallelism): 并行是指多個任務(wù)或多個數(shù)據(jù)在同一時刻被執(zhí)行
舉個例子:
- 并發(fā): 類似一個單線程的服務(wù)器, 可以在短時間內(nèi)處理多個請求, 但是一次只能處理一個請求. 當?shù)却粋€請求數(shù)據(jù)時, 可以切換到另一個請求
- 并行: 想象成一個多線程的計算任務(wù), 每個線程在多核 CPU 不同核心上同時執(zhí)行
舉個生活中的例子:
小白吃飯吃到一半, 電話來了, 我一直到吃完了以后才去接, 這就說明你不支持并發(fā)也不支持并行.
小白吃飯吃到一半, 電話來了, 你停了下來接了電話, 接完后繼續(xù)吃飯, 這說明你支持并發(fā).
小白吃飯吃到一半, 電話來了, 你一邊聽電話一邊吃飯, 這說明你支持并行.
應(yīng)用:
- 并發(fā): 進行任務(wù)之間的協(xié)調(diào) & 同步, 難點在有效地處理資源爭用 & 死鎖
- 并行: 同時進行多個任務(wù), 難點在于負載均衡和通信開銷
單線程 vs 多線程
單線程 vs 多線程:
- 單線程: 在同一時間處理一個任務(wù)
- 多線程: 在同一時間處理多個任務(wù)
GIL
GIL (Global Interpreter Lock) 全局解釋器, 來源是 Python設(shè)計之初的考慮, 為了數(shù)據(jù)安全所做的決定.
每個 CPU 在同一時間只能執(zhí)行一個線程 (在單核 CPU 下的多線程其實都只是并發(fā), 不是并行, 并發(fā)和并行從宏觀上來講都是同時處理多路請求的概念. 但并發(fā)和并行又有區(qū)別, 并行是指兩個或者多個事件在同一時刻發(fā)生, 而并發(fā)是指兩個或多個事件在同一時間間隔內(nèi)發(fā)生.
Numpy 在數(shù)據(jù)科學中的重要性
在現(xiàn)代數(shù)據(jù)科學領(lǐng)域, 數(shù)據(jù)處理, 清晰, 統(tǒng)計分析, 特征工廠, 機器學習等各個領(lǐng)域都離不開數(shù)值計算. Numpy 為我們提供了一套完整, 高效的工具, 使得我們的任務(wù)變得簡單. 幾乎所有的 Python 數(shù)據(jù)處理庫, 如 Pandas, Scipy 等, 都是基于 Numpy 構(gòu)建的. 所以我們非常有必要要熟悉掌握 Numpy 庫.
Numpy 安裝
安裝命令:
pip install numpy
pip3 install numpy
Anaconda
Anaconda 是一個計算科學庫, 可以為我們提供便利的 Python 環(huán)境.
安裝:
Anaconda 官網(wǎng)
導包
導入 Numpy 包:
# 導包
import numpy as npprint(np.__version__)
ndarray
ndarray 是 Numpy 最重要的一個特點. ndarray 是一個 N 維數(shù)組對象.
np.array 創(chuàng)建
np.array
可以幫助我們創(chuàng)建一 ndarray.
格式:
numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)
參數(shù):
- object: 類數(shù)組
- dtype: 數(shù)據(jù)類型, 可選
例子:
# 導包
import numpy as np# 創(chuàng)建ndarray
array1 = np.array([1, 2, 3]) # 通過lsit創(chuàng)建
array2 = np.array([1, 2, 3], dtype=float)# 調(diào)試輸出
print(array1, type(array1))
print(array2, type(array2))
輸出結(jié)果:
[1 2 3] <class 'numpy.ndarray'>
[1. 2. 3.] <class 'numpy.ndarray'>
數(shù)組屬性
創(chuàng)建 Numpy 數(shù)組后, 我們可以進一步查詢 ndarray 的屬性, 如形狀, 維度, 數(shù)據(jù)類型等:
- shape: 返回數(shù)組的形狀
- dtype: 返回數(shù)組中元素的數(shù)據(jù)類型
- ndim: 返回數(shù)組的維度
- size: 返回數(shù)組的元素總數(shù)
例子:
"""
@Module Name: Numpy 數(shù)組屬性.py
@Author: CSDN@我是小白呀
@Date: October 13, 2023Description:
Numpy 數(shù)組屬性
"""import numpy as np# 創(chuàng)建 ndarray
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)# 輸出數(shù)組屬性
print(arr.shape) # 輸出 [2, 3] (兩行, 三列)
print(arr.dtype) # 輸出 int32 (整型)
print(arr.ndim) # 輸出 2 (二維數(shù)組)
print(arr.size) # 輸出 6 (2*3, 6個元素)
np.zeros 創(chuàng)建
np.zeros
可以幫助我們創(chuàng)建指定形狀的全 0 數(shù)組.
格式:
numpy.zeros(shape, dtype=float, order='C', *, like=None)
參數(shù):
- shape: 數(shù)組形狀
- detype: 默認為 float, 浮點型
例子:
import numpy as np# 創(chuàng)建全0的ndarray
array = np.zeros((3, 3), dtype=int)
print(array)
輸出結(jié)果:
[[0 0 0][0 0 0][0 0 0]]
np.ones 創(chuàng)建
np.zeros
可以幫助我們創(chuàng)建指定形狀的全 1 數(shù)組.
格式:
numpy.ones(shape, dtype=float, order='C', *, like=None)
參數(shù):
- shape: 數(shù)組形狀
- detype: 默認為 float, 浮點型
例子:
import numpy as np# 創(chuàng)建全1的ndarray
array = np.ones((3, 3), dtype=int)
print(array)
print(type(array))
輸出結(jié)果:
[[1 1 1][1 1 1][1 1 1]]
<class 'numpy.ndarray'>
數(shù)組的切片和索引
Numpy 數(shù)組支持 Python 的索引和切片操作, 并提供了更為豐富的功能.
格式 1:
數(shù)組[起始索引:結(jié)束索引]
- 起始索引: 取的到
- 結(jié)束索引: 取不到
格式 2:
數(shù)組[起始索引:結(jié)束索引:間隔]
- 起始索引: 取的到
- 結(jié)束索引: 取不到
- 間隔: 間隔幾個數(shù)
基本索引
import numpy as np# 創(chuàng)建 ndarray
arr = np.array([1, 2 ,3 ,4 ,5])# 切片, 取索引 0 對應(yīng)的元素
print("輸出第一個元素:", arr[0])
輸出結(jié)果:
輸出第一個元素: 1
切片操作
例子:
import numpy as np# 創(chuàng)建 ndarray
arr = np.array([1, 2 ,3 ,4 ,5])# 切片數(shù)組前三個元素
print("前三個素:", arr[:3])# 切片數(shù)組 2-3
print("2-3 元素:", arr[1:3])# 切片最后一個元素
print("最后一個元素:", arr[-1])# 切片奇數(shù)索引
print("奇數(shù)元素:", arr[::2])# 切片反轉(zhuǎn)
print("反轉(zhuǎn)數(shù)組:", arr[::-1])
輸出結(jié)果:
前三個素: [1 2 3]
2-3 元素: [2 3]
最后一個元素: 5
奇數(shù)元素: [1 3 5]
反轉(zhuǎn)數(shù)組: [5 4 3 2 1]
數(shù)組運算
與 Python 的內(nèi)置列表不同, Numpy 數(shù)組支持元素級別的運算. 我們可以對 ndarray 進行加, 減, 乘, 除等操作.
例子:
常用函數(shù)
reshape
通過reshape()
我們可以改變數(shù)組形狀.
格式:
numpy.reshape(arr, newshape, order='C')
參數(shù):
- arr: 需要改變形狀的數(shù)組
- newshape: 新的形狀
例子:
import numpy as np# 創(chuàng)建ndarray
array = np.zeros(9)
print(array)# reshape
array = array.reshape((3,3))
print(array)
print(array.shape) # 調(diào)試輸出數(shù)組形狀
輸出結(jié)果:
[0. 0. 0. 0. 0. 0. 0. 0. 0.]
[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]
(3, 3)
flatten
通過flatten()
我們可以將多維數(shù)組攤平成1 維數(shù)組.
例子:
import numpy as np# 創(chuàng)建多維數(shù)組
array = np.zeros((3, 3))
print(array)# flatten轉(zhuǎn)變?yōu)橐痪S數(shù)組
array = array.flatten()
print(array)
輸出結(jié)果:
[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]
[0. 0. 0. 0. 0. 0. 0. 0. 0.]
聚合函數(shù)
常見的聚合函數(shù):
- np.sum(): 求和
- np.min(): 求最小值
- np.max(): 求最大值
- np.mean(): 計算平均值
- np.median(): 計算中位數(shù)
例子:
import numpy as np# 創(chuàng)建 ndarray
arr = np.array([1, 2, 3, 4, 5])# 調(diào)用常用聚合函數(shù)
print(np.sum(arr))
print(np.min(arr))
print(np.max(arr))
print(np.mean(arr))
print(np.median(arr))
輸出結(jié)果:
15
1
5
3.0
3.0
Numpy 的高級功能
下面我們來講一下 Numpy 的高級功能. Numpy 的高級功能可以幫助我們有效的處理數(shù)據(jù), 進行科學計算, 以便幫我們更好地處理數(shù)據(jù).
廣播
廣播 (Broadcasting) 是 Numpy 的一個強大功能, 可以幫助我們進行不同形狀數(shù)組的的運算. Numpy 中廣播的規(guī)則是從尾部的維度開始對比.
例子:
import numpy as np# 廣播
a = np.array([1, 2, 3])
b = np.array([[10], [20], [30]])
print(a + b)
輸出結(jié)果:
[[11 12 13][21 22 23][31 32 33]]
矩陣計算
例子:
import numpy as np# 定義矩陣
mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[2, 0], [1, 3]])# 矩陣乘法
# 1*2 + 2*1 = 2
# 1*1 + 2*3 = 6
# 3*2 + 4*1 = 10
# 3*0 + 4*3 = 12
result = np.dot(mat1, mat2)
print(result)
輸出結(jié)果:
[[ 4 6][10 12]]
Numpy 實際應(yīng)用
當我們已經(jīng)掌握了 Numpy 的基礎(chǔ)用法和高級功能后, 小白我來帶大家了解一下 Numpy 的實際應(yīng)用.
統(tǒng)計分析
求數(shù)組平均數(shù)和標準差:
import numpy as np# 定義數(shù)組
data = np.array([23, 45, 56, 78, 12, 9])# 計算平均值和標準差
print("平均值:", np.mean(data))
print("標準差:", np.std(data))
輸出結(jié)果:
3.14
圖像處理
利用 Numpy, 我們可以將圖像轉(zhuǎn)化為數(shù)組進行處理.
例子:
import numpy as np
from PIL import Image# 將圖像轉(zhuǎn)化為數(shù)據(jù)
image = Image.open('path_to_image.jpg')
image_array = np.array(image)
print(image_array.shape)
輸出結(jié)果:
(1707, 2560, 3)
解方程
例子:
import numpy as np
from numpy.linalg import solve# 創(chuàng)建 ndarray
a = np.array([[3, 1], [1, 2]]) # 3x + y = 9
b = np.array([9, 8]) # x + 2y = 8# 解方程
x = solve(a, b) # x = 2, y = 3
print(x)
輸出結(jié)果:
[2. 3.]
結(jié)論
在本篇文章中, 我們深入地探討了 Numpy, 這是 Python 中用于數(shù)值計算和數(shù)據(jù)分析的核心庫. 從數(shù)組的基本操作, 數(shù)組的形狀和維度, 高級數(shù)組操作, 到 Numpy 的最佳實踐和常見誤區(qū), 我們嘗試為讀者提供了一個全面且深入的視角.
Numpy 的真正威力在于其高效性和靈活性. 它為我們提供了大量的功能, 能幫助我們輕松處理大規(guī)模的數(shù)值數(shù)據(jù). 但與此同時, 也需要注意其特定的工作原理, 避免常見的陷阱.
對于初學者來說, 可能需要一些時間來適應(yīng) Numpy 的思維方式, 特別是它的廣播機制和向量化操作. 但一旦你習慣了這種方式, 你會發(fā)現(xiàn)自己的數(shù)據(jù)處理能力大大增強.
無論你是數(shù)據(jù)分析師, 科學家還是工程師, 掌握 Numpy 都將是你數(shù)據(jù)處理技能的重要組成部分. 希望這篇文章能為你在 Python 數(shù)據(jù)處理之路上提供一些有用的指導.
練習
練習1
數(shù)組創(chuàng)建與基礎(chǔ)操作:
- 創(chuàng)建一個形狀為 (5, 5) 的數(shù)組,其中所有元素都為整數(shù)1。
- 創(chuàng)建一個長度為 20 的一維隨機整數(shù)數(shù)組,范圍在 1 到 100 之間。
- 將上述一維數(shù)組重新塑形為 (5, 4) 的二維數(shù)組。
練習2
數(shù)組索引與切片:
- 創(chuàng)建一個形狀為 (10, 10) 的隨機整數(shù)數(shù)組,范圍在 1 到 100 之間。提取出其中的第 3 到 8 行,第 4 到 9 列的子數(shù)組。
- 從上述數(shù)組中,提取出所有的偶數(shù)元素。
練習3
數(shù)組操作與數(shù)學運算:
- 創(chuàng)建兩個形狀為 (3, 3) 的隨機整數(shù)數(shù)組 A 和 B,范圍在 1 到 10 之間。計算 A 與 B 的點積。
- 計算上述數(shù)組 A 的逆矩陣(如果存在)。
參考答案
練習1
import numpy as nparray = np.ones([5,5], dtype=int)
print(array)
array = np.random.randint(1, 101, size=20)
print(array)
array = array.reshape((5, 4))
print(array)
輸出結(jié)果:
[[1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1]]
[22 13 20 67 5 91 26 64 84 85 59 66 44 83 41 63 44 23 76 35]
[[22 13 20 67][ 5 91 26 64][84 85 59 66][44 83 41 63][44 23 76 35]]
練習2
import numpy as nparray = np.random.randint(1, 101, size=(10, 10)).reshape((10,10))
print(array)
array = array[2:8, 3:9]
print(array)
array = array[array % 2 == 0]
print(array)
輸出結(jié)果:
[[1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1]]
[ 32 6 91 48 63 81 87 28 19 25 20 93 97 100 70 77 3 46100 7]
[[ 32 6 91 48][ 63 81 87 28][ 19 25 20 93][ 97 100 70 77][ 3 46 100 7]]
[[1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1][1 1 1 1 1]]
[71 63 6 50 59 69 14 18 80 88 68 54 35 97 51 82 86 50 61 9]
[[71 63 6 50][59 69 14 18][80 88 68 54][35 97 51 82][86 50 61 9]]
練習3
import numpy as npa = np.random.randint(1, 11, size=(3, 3))
b = np.random.randint(1, 11, size=(3, 3))
print(a)
print(b)
result = np.dot(a, b)
print(result)det_a = np.linalg.det(a)if det_a == 0:print("矩陣 A 不可逆")
else:inverse_a = np.linalg.inv(a)print("A 的逆矩陣為: \n", inverse_a)
輸出結(jié)果:
[[ 8 6 4][10 5 5][ 7 7 9]]
[[ 7 2 9][10 9 6][ 5 7 1]]
[[136 98 112][145 100 125][164 140 114]]
A 的逆矩陣為: [[-9.09090909e-02 2.36363636e-01 -9.09090909e-02][ 5.00000000e-01 -4.00000000e-01 -7.93016446e-18][-3.18181818e-01 1.27272727e-01 1.81818182e-01]]