python里的NumPy算法

NumPy(Numerical Python)是 Python 中用于科學計算的基礎庫,提供了高性能的多維數組對象、矩陣運算以及大量數學函數庫。其核心優勢在于通過向量化操作替代傳統循環,大幅提升計算效率,尤其適合處理大規模數據的算法實現。以下從算法核心、常用操作及經典算法案例展開介紹:

一、NumPy 算法核心:向量化與廣播機制

1.?向量化運算(Vectorization)
  • 定義:無需循環即可對數組執行批量數學操作,底層由 C 語言實現,效率遠高于 Python 循環。
  • 示例
  • mport numpy as np
    # 傳統循環計算數組平方
    arr = np.array([1, 2, 3, 4])
    result1 = []
    for x in arr:result1.append(x ** 2)
    # 向量化計算
    result2 = arr ** 2  # 直接對數組所有元素平方
  • 優勢:避免 Python 解釋器的循環開銷,計算速度提升 10-100 倍。
2.?廣播機制(Broadcasting)
  • 定義:允許不同形狀的數組進行運算時自動擴展維度,簡化矩陣運算邏輯。
  • 規則
    1. 從后往前比較數組維度,維度小的數組自動填充至與維度大的數組一致;
    2. 若某維度為 1,則沿該維度復制擴展。
  • 示例
    a = np.array([[1, 2], [3, 4]])  # 形狀(2,2)
    b = np.array([10, 20])         # 形狀(2,)
    c = a + b  # 廣播后b變為[[10,20],[10,20]],結果形狀(2,2)

二、NumPy 常用算法操作

1.?數組運算算法
  • 數學函數np.sin()np.exp()np.log()(對數組元素逐元素計算)。
  • 統計函數np.mean()(均值)、np.std()(標準差)、np.percentile()(分位數)。
  • 線性代數np.dot()(矩陣乘法)、np.linalg.inv()(矩陣求逆)、np.linalg.eig()(特征值分解)。
2.?排序與搜索算法
  • 排序np.sort()(返回排序后數組)、np.argsort()(返回排序索引)。
  • 搜索np.where(arr > 0)(查找滿足條件的元素索引)、np.searchsorted()(二分查找插入位置)。
3.?傅里葉變換(FFT)
  • 函數np.fft.fft()(快速傅里葉變換)、np.fft.ifft()(逆變換),用于信號處理、圖像處理等。
  • 示例
t = np.linspace(0, 1, 1000)
signal = np.sin(2*np.pi*50*t) + 0.5*np.sin(2*np.pi*100*t)
fft_result = np.fft.fft(signal)
freq = np.fft.fftfreq(len(t), t[1]-t[0])  # 計算頻率軸
4.?隨機數生成與統計模擬
  • 分布采樣np.random.normal()(正態分布)、np.random.binomial()(二項分布)。
  • 蒙特卡洛模擬:通過大量隨機樣本估算復雜問題,如用np.random.uniform()生成均勻隨機數計算 π 值。

三、經典算法案例:從原理到 NumPy 實現

1.?線性回歸(最小二乘法)
  • 原理:通過最小化誤差平方和擬合線性模型?y=β0?+β1?x。
  • NumPy 實現
  • def linear_regression(x, y):# 添加截距項X = np.column_stack((np.ones_like(x), x))# 最小二乘法公式:β = (X^T X)?1 X^T ybeta = np.linalg.inv(X.T @ X) @ X.T @ yreturn beta# 示例數據
    x = np.array([1, 2, 3, 4, 5])
    y = np.array([2.1, 3.9, 5.2, 7.0, 8.9])
    beta = linear_regression(x, y)  # 輸出截距和斜率
2.?K 最近鄰(KNN)算法
  • 原理:通過計算樣本與訓練數據的距離,取最近的 K 個樣本的標簽進行投票分類。
  • NumPy 實現(簡化版)
  • class KNN:def __init__(self, k=3):self.k = kdef fit(self, X, y):self.X_train = Xself.y_train = ydef predict(self, X_test):predictions = []for x in X_test:# 計算歐氏距離distances = np.sqrt(np.sum((self.X_train - x) **2, axis=1))# 取最近的k個樣本的標簽nearest_idx = np.argsort(distances)[:self.k]nearest_labels = self.y_train[nearest_idx]# 投票(取出現最多的標簽)pred = np.bincount(nearest_labels).argmax()predictions.append(pred)return np.array(predictions)
3.?快速排序(向量化優化)
  • 傳統遞歸實現:效率受 Python 循環限制;
  • NumPy 向量化思路:利用布爾索引替代遞歸劃分。
  • 示例(非完整實現)
  • def vectorized_quicksort(arr):if len(arr) <= 1:return arrpivot = arr[0]# 向量化劃分less = arr[arr < pivot]equal = arr[arr == pivot]greater = arr[arr > pivot]return np.concatenate([vectorized_quicksort(less), equal, vectorized_quicksort(greater)])

四、NumPy 算法優化技巧

  1. 避免頻繁創建數組
    np.zeros()預分配內存,替代多次np.append()

  2. result = np.zeros((1000, 1000))  # 預分配
    for i in range(1000):result[i] = compute_row(i)  # 直接賦值
  1. 利用矩陣運算替代循環
    例如計算協方差矩陣時,用np.cov()替代手動循環累加。

  2. 使用 Numba 加速
    對計算密集型函數,用@numba.jit編譯為機器碼,進一步提升性能。

  3. import numba as nb@nb.jit(nopython=True)
    def compute_square(arr):return arr ** 2

?

  1. 并行計算
    結合np.parallel模塊或 Dask 庫,實現多線程 / 多節點數據處理。

五、NumPy 在算法領域的應用場景

  • 科學計算:物理模擬、數值積分(np.trapz)、微分方程求解。
  • 機器學習:特征工程(標準化np.std、歸一化np.linalg.norm)、模型訓練(矩陣運算)。
  • 數據分析:統計分析、信號處理(FFT)、圖像處理(卷積np.convolve)。
  • 深度學習底層:TensorFlow、PyTorch 等框架的底層數組操作依賴 NumPy(或類似結構)。

?

?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907438.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HarmonyOS優化應用文件上傳下載慢問題性能優化

一、概述 在開發應用時&#xff0c;客戶端與服務器之間數據交換的效率取決于文件傳輸的性能。一個數據交換性能較低的應用會導致其在加載過程中耗費較長時間&#xff0c;在很多的場景造成頁面卡頓&#xff0c;極大的影響了用戶體驗。相反&#xff0c;一個數據交換高效的應用&a…

64、【OS】【Nuttx】任務休眠與喚醒:clock_nanosleep

背景 之前的 blog 63、【OS】【Nuttx】任務休眠與喚醒&#xff1a;sleep 分析了任務休眠中的 sleep 函數&#xff0c;下面繼續來分析下 sleep 函數中的核心功能 clock_nanosleep clock_nanosleep usleep 上篇 blog 分析了 sleep 函數&#xff0c;其核心功能封裝到了 clock_…

【生產實踐】華為存儲XSG1在RHEL 7.x/8.x上的多路徑配置操作手冊(生產環境)

一、概述 本手冊針對Red Hat Enterprise Linux 7.x/8.x系統與華為XSG1存儲設備的多路徑I/O&#xff08;MPIO&#xff09;配置&#xff0c;通過優化路徑策略實現高可用、負載均衡及故障容錯&#xff0c;適配華為存儲硬件特性&#xff0c;滿足生產環境需求。 二、參數解析與配置…

Unity開發之Webgl自動更新程序包

之前讓客戶端更新webgl程序是在程序里寫版本號然后和服務器對比&#xff0c;不同就調用 window.location.reload(true);之前做的客戶端都是給企業用&#xff0c;用戶數少看不出來啥問題。后來自己開發一個小網站&#xff0c;用戶數量還是挺多&#xff0c;然后就會遇到各種各樣的…

一個開源腳本,可自動安裝在 AMD Radeon 7900XTX 上運行選定 AI 接口所需的所有內容

?一、軟件介紹 文末提供程序和源碼下載 一個開源腳本&#xff0c;可自動安裝在 AMD Radeon 7900XTX 上運行選定 AI 接口所需的所有內容。 二、ROCm-AI-Installer ROCm-AI-安裝程序 一個開源腳本&#xff0c;可自動安裝在 AMD Radeon 7900XTX 上運行選定 AI 接口所需的所有內…

【Axure結合Echarts繪制圖表】

1.繪制一個矩形&#xff0c;用于之后存放圖表&#xff0c;將其命名為test&#xff1a; 2.新建交互 -> 載入時 -> 打開鏈接&#xff1a; 3.鏈接到URL或文件路徑&#xff1a; 4.點擊fx&#xff1a; 5.輸入&#xff1a; javascript: var script document.createEleme…

Relooking:損失權重λ 、梯度權重α、學習率η

一般多任務&#xff0c;大家都喜歡疊加很多損失&#xff0c;由此產生很多損失權重系數。此外&#xff0c;有的學者直接對梯度進行操作。咋一看&#xff0c;上面三個系數貌似重復多余&#xff0c;直接用其中一個系數代替不行嗎&#xff1f;為此&#xff0c;回顧了下神經網絡的前…

數學復習筆記 20

復習方程組&#xff0c;還有隨便復習一下高數和矩陣&#xff0c;向量。現在是復習高數的導數這一章。兩個曲線相切&#xff0c;列出方程&#xff0c;然后解出參數&#xff0c;沒有任何難度呢。算切線方程&#xff0c;就是&#xff0c;算導數&#xff0c;導數就用導數定義&#…

Sqlalchemy 連mssql坑

連接失敗: (pyodbc.OperationalError) (08001, [08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:0A00014D:SSL routines::legacy sigalg disallowed or unsupported] (-1) (SQLDriverConnect)) (Background on this error at: https://sqlalche.me/e/…

AI大模型學習三十、ubuntu安裝comfyui,安裝插件,修改返回405 bug,值得一看喔

一、說明 ComfyUI是一個開源的、基于節點的Web應用。它允許用戶根據一系列文本提示&#xff08;Prompt&#xff09;生成圖像。 ComfyUI使用擴散模型作為基礎模型&#xff0c;并結合 ControlNet、Lora和LCM低階自適應等模型&#xff0c;每個工具都由程序中的一個節點表示 二、開…

MySQL(40)如何使用DROP TABLE刪除表?

DROP TABLE 語句用于從數據庫中永久刪除一個表及其所有數據。執行該語句后&#xff0c;表結構和數據都將被徹底刪除&#xff0c;且無法恢復。因此&#xff0c;在執行 DROP TABLE 操作之前&#xff0c;請確保已備份好相關數據。 基本語法 DROP TABLE table_name;如果要刪除多個…

element ui 表格 勾選復選框后點擊分頁不保存之前的數據問題

element ui 表格 勾選復選框后點擊分頁不保存之前的數據問題 給 el-table上加 :row-key"getRowKey"給type“selection” 上加 :reserve-selection"true"

vite常見面試問題

一、Vite 核心原理 1. Vite 為什么比 Webpack 快? 答案: Vite 的核心優勢在于開發環境和生產環境的雙重優化: 開發環境: 基于原生 ESM(ES Modules):瀏覽器直接加載 ES 模塊,無需打包,啟動時間極短(毫秒級)。按需編譯:僅編譯當前頁面所需的模塊,而非整個項目。預…

Screen 連接遠程服務器(Ubuntu)

連接 1. 安裝screen 默認預安裝&#xff0c;可以通過命令查看&#xff1a; screen --version 若未安裝&#xff1a; # Ubuntu/Debian sudo apt-get install screen 2. 本機連接遠程服務器 ssh root192.168.x.x 在遠程服務器中打開screen&#xff1a; screen -S <nam…

Flutter GridView網格組件

目錄 常用屬性 GridView使用配置 GridView.count使用 GridView.extent使用 GridView.count Container 實現列表 GridView.extent Container 實現列表 GridView.builder使用 GridView網格布局在實際項目中用的也是非常多的&#xff0c;當我們想讓可以滾動的元素使用矩陣…

Jenkins實踐(8):服務器A通過SSH調用服務器B執行Python自動化腳本

Jenkins實踐(8):服務器A通過SSH調用服務器B執行Python自動化腳本 1、需求: 1、Jenkins服務器在74上,Python腳本在196服務器上 2、需要在服務器74的Jenkins上調用196上的腳本執行Python自動化測試 2、操作步驟 第一步:Linux Centos7配置SSH免密登錄 Linux Centos7配置S…

C#二維碼:利用 ThoughtWorks.QRCode 庫實現二維碼生成與解析

C#二維碼&#xff1a;利用 ThoughtWorks.QRCode 庫實現二維碼生成與解析 在當今數字化信息交互頻繁的時代&#xff0c;二維碼憑借其信息容量大、容錯能力強、易識別等特點&#xff0c;廣泛應用于各個領域。從移動支付、產品溯源到活動簽到&#xff0c;二維碼無處不在。在 C# 開…

【Java Web】速通JavaScript

參考筆記:JavaWeb 速通JavaScript_javascript 速通-CSDN博客 目錄 一、JavaScript快速入門 1. 基本介紹 2. JavaScript特點 3. JavaScript的引入方式(重要) 3.1 寫在script標簽中 ?????3.2 以外部文件方式引入 二、JS的數據類型 1. 變量 2. 常用數據類型 3.特殊值 三、…

Python打卡訓練營-Day13-不平衡數據的處理

浙大疏錦行 知識點&#xff1a; 不平衡數據集的處理策略&#xff1a;過采樣、修改權重、修改閾值交叉驗證代碼 過采樣 過采樣一般包含2種做法&#xff1a;隨機采樣和SMOTE 過采樣是把少的類別補充和多的類別一樣多&#xff0c;欠采樣是把多的類別減少和少的類別一樣 一般都是缺…

Mac OS 使用說明

Mac 的啟動組合鍵 了解可通過在啟動時按住一個或多個按鍵來訪問的 Mac 功能和工具。 若要使用這些組合鍵中的任何一個&#xff0c;請在按下電源按鈕以開啟 Mac 后或在 Mac 開始重新啟動后&#xff0c;立即按住相應按鍵。請一直按住&#xff0c;直至電腦出現對應的行為。 !!!上…