【NumPy進階】:內存視圖、性能優化與高級線性代數

目錄

  • 1. 深入理解 NumPy 的內存視圖與拷貝
    • 1.1 內存視圖(View)
      • 1.1.1 創建視圖
      • 1.1.2 視圖的特點
    • 1.2 數組拷貝(Copy)
      • 1.2.1 創建拷貝
      • 1.2.2 拷貝的特點
    • 1.3 視圖與拷貝的選擇
  • 2. NumPy 的優化與性能提升技巧
    • 2.1 向量化操作
      • 示例:向量化替代循環
    • 2.2 使用內存視圖而非拷貝
    • 2.3 使用合適的數據類型
    • 2.4 并行計算
    • 2.5 使用 `numexpr` 和 `Numba` 加速
  • 3. 探索 `np.linalg` 模塊的高級線性代數運算
    • 3.1 矩陣乘法
    • 3.2 求解線性方程組
    • 3.3 計算矩陣的逆
    • 3.4 特征值和特征向量
    • 3.5 奇異值分解(SVD)
  • 總結


在基礎學習的基礎上,接下來我們將深入探索 NumPy 的三個重要主題:內存視圖與拷貝性能優化技巧高級線性代數運算。通過掌握這些內容,你將能夠更高效地處理大型數據、優化計算性能,并在實際應用中使用高級的線性代數工具。


1. 深入理解 NumPy 的內存視圖與拷貝

1.1 內存視圖(View)

內存視圖 是對原始數組數據的引用,而不是數據的副本。通過視圖修改數據會影響原始數組。視圖不會占用額外的內存,非常適合大數據處理。

NumPy 中的內存視圖通常指的就是ndarray 數組類型的切片。

1.1.1 創建視圖

import numpy as nparr = np.array([1, 2, 3, 4, 5])# 創建一個視圖
view = arr[1:4]
print("View:", view)  # 輸出: [2 3 4]# 修改視圖
view[0] = 99
print("Original Array:", arr)  # 輸出: [ 1 99  3  4  5]

1.1.2 視圖的特點

  • 視圖和原數組共享相同的內存。
  • 視圖的修改會影響原數組。
  • 視圖的創建效率高,不涉及數據復制。

1.2 數組拷貝(Copy)

拷貝 是對原始數據的完整復制,修改拷貝不會影響原數組。拷貝適合需要保持原數據不變的場景。

1.2.1 創建拷貝

arr = np.array([1, 2, 3, 4, 5])# 創建一個拷貝
copy = arr[1:4].copy()
print("Copy:", copy)  # 輸出: [2 3 4]# 修改拷貝
copy[0] = 99
print("Original Array:", arr)  # 輸出: [1 2 3 4 5]

1.2.2 拷貝的特點

  • 拷貝與原數組獨立存儲。
  • 拷貝的修改不會影響原數組。
  • 創建拷貝需要額外的內存和時間。

1.3 視圖與拷貝的選擇

  • 使用視圖:在內存敏感和數據量大的情況下,使用視圖提高效率。
  • 使用拷貝:在需要保護原始數據時,使用拷貝避免數據被意外修改。

2. NumPy 的優化與性能提升技巧

2.1 向量化操作

NumPy 的向量化操作利用底層 C 語言實現的高效算法,避免了 Python 的 for 循環,極大提高了性能。

示例:向量化替代循環

import numpy as np# 使用循環計算平方
arr = np.array([1, 2, 3, 4, 5])
squared_loop = [x**2 for x in arr]# 使用向量化計算平方
squared_vectorized = arr**2print(squared_vectorized)  # 輸出: [ 1  4  9 16 25]

2.2 使用內存視圖而非拷貝

避免不必要的數據拷貝,使用視圖可以節省內存和時間。

arr = np.random.rand(10000)# 使用視圖進行切片
view = arr[:5000]

2.3 使用合適的數據類型

選擇合適的數據類型可以減少內存消耗和提高計算速度。

# 使用 float32 而不是 float64
arr = np.array([1.2, 3.4, 5.6], dtype=np.float32)

2.4 并行計算

NumPy 在底層對一些操作進行了并行化,例如矩陣乘法、求和等。

A = np.random.rand(1000, 1000)
B = np.random.rand(1000, 1000)# 并行執行矩陣乘法
result = np.dot(A, B)

2.5 使用 numexprNumba 加速

  • numexpr:用于加速復雜的數學表達式。
  • Numba:通過 Just-In-Time (JIT) 編譯加速 Python 函數。
import numexpr as ne
import numpy as npa = np.random.rand(1000000)
b = np.random.rand(1000000)# 使用 numexpr 加速計算
result = ne.evaluate("a + b")

詳情見此博客:【NumPy】使用numexpr和Numba加速運算


3. 探索 np.linalg 模塊的高級線性代數運算

NumPy 的 np.linalg 模塊提供了許多高級線性代數功能,包括矩陣分解、求解線性方程組、特征值分解等。

3.1 矩陣乘法

import numpy as npA = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩陣乘法
result = np.dot(A, B)
print(result)

輸出:

[[19 22][43 50]]

3.2 求解線性方程組

求解形如 A x = b Ax = b Ax=b 的線性方程組。

A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])x = np.linalg.solve(A, b)
print(x)

輸出:

[2. 3.]

3.3 計算矩陣的逆

A = np.array([[1, 2], [3, 4]])
inv_A = np.linalg.inv(A)
print(inv_A)

輸出:

[[-2.   1. ][ 1.5 -0.5]]

3.4 特征值和特征向量

A = np.array([[4, -2], [1, 1]])# 計算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Eigenvalues:", eigenvalues)
print("Eigenvectors:\n", eigenvectors)

3.5 奇異值分解(SVD)

A = np.array([[1, 2], [3, 4]])U, S, VT = np.linalg.svd(A)
print("U:\n", U)
print("S:\n", S)
print("VT:\n", VT)

總結

通過深入學習以上內容,你可以更靈活、高效地使用 NumPy:

  1. 內存視圖與拷貝:理解何時使用視圖、何時使用拷貝。
  2. 性能優化技巧:利用向量化、合適的數據類型和并行計算來提升性能。
  3. 高級線性代數運算:使用 np.linalg 模塊解決復雜的線性代數問題。

繼續練習這些概念和技巧,將幫助你在數據科學、機器學習和科學計算領域更上一層樓!

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

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

相關文章

HarmonyOS 5.0應用開發——屬性動畫

【高心星出品】 文章目錄 屬性動畫animateTo屬性動畫animation屬性動畫 屬性動畫 屬性接口(以下簡稱屬性)包含尺寸屬性、布局屬性、位置屬性等多種類型,用于控制組件的行為。針對當前界面上的組件,其部分屬性(如位置屬…

機器學習支持向量機(SVM)算法

一、引言 在當今數據驅動的時代,機器學習算法在各個領域發揮著至關重要的作用。支持向量機(Support Vector Machine,SVM)作為一種強大的監督學習算法,以其在分類和回歸任務中的卓越性能而備受矚目。SVM 具有良好的泛化…

介紹一款docker ui 管理工具

http://vm01:18999/main.html 管理員登陸賬號 jinghan/123456 ui啟動命令所在文件夾目錄 /work/docker/docker-ui 參考鏈接 DockerUI:一款功能強大的中文Docker可視化管理工具_docker ui-CSDN博客

Motrix WebExtension 使用教程

Motrix WebExtension 使用教程 項目地址:https://gitcode.com/gh_mirrors/mo/motrix-webextension 項目介紹 Motrix WebExtension 是一個瀏覽器擴展,用于與 Motrix 下載管理器集成。該擴展允許用戶通過 Motrix 下載管理器自動下載文件,而不是使用瀏覽器的原生下載管理器。…

前端(四)css選擇器、css的三大特性

css選擇器、css的三大特性 文章目錄 css選擇器、css的三大特性一、css介紹二、css選擇器2.1 基本選擇器2.2 組合選擇器2.3 交集并集選擇器2.4序列選擇器2.5屬性選擇器2.6偽類選擇器2.7偽元素選擇器 三、css三大特性3.1 繼承性3.2 層疊性3.3 優先級 一、css介紹 CSS全稱為Casca…

《探索視頻數字人:開啟未來視界的鑰匙》

一、引言 1.1視頻數字人技術的崛起 在當今科技飛速發展的時代,視頻數字人技術如一顆璀璨的新星,正逐漸成為各領域矚目的焦點。它的出現,猶如一場科技風暴,徹底改變了傳統的視頻制作方式,為各個行業帶來了前所未有的機…

【ETCD】[源碼閱讀]深度解析 EtcdServer 的 processInternalRaftRequestOnce 方法

在分布式系統中,etcd 的一致性與高效性得益于其強大的 Raft 協議模塊。而 processInternalRaftRequestOnce 是 etcd 服務器處理內部 Raft 請求的核心方法之一。本文將從源碼角度解析這個方法的邏輯流程,幫助讀者更好地理解 etcd 的內部實現。 方法源碼 …

免費下載 | 2024算網融合技術與產業白皮書

《2024算網融合技術與產業白皮書(2023年)》的核心內容概括如下: 算網融合發展概述: 各國細化算網戰略,指引行業應用創新升級。 算網融合市場快速增長,算力互聯成為投資新熱點。 算網融合產業模式逐漸成型…

基于卷積神經網絡的圖像二分類檢測模型訓練與推理實現教程 | 幽絡源

前言 對于本教程,說白了,就是期望能通過一個程序判斷一張圖片是否為某個物體,或者說判斷一張圖片是否為某個缺陷。因為本教程是針對二分類問題,因此主要處理 是 與 不是 的問題,比如我的模型是判斷一張圖片是否為蘋果…

安全見聞全解析

跟隨 瀧羽sec團隊學習 聲明! 學習視頻來自B站up主 瀧羽sec 有興趣的師傅可以關注一下,如涉及侵權馬上刪除文章,筆記只是方便各位師傅的學習和探討,文章所提到的網站以及內容,只做學習交流,其他均與本人以及…

代碼隨想錄-算法訓練營-番外(圖論02:島嶼數量,島嶼的最大面積)

day02 圖論part02 今日任務:島嶼數量,島嶼的最大面積 都是一個模子套出來的 https://programmercarl.com/kamacoder/0099.島嶼的數量深搜.html#思路往日任務: day01 圖論part01 今日任務:圖論理論基礎/所有可到達的路徑 代碼隨想錄圖論視頻部分還沒更新 https://programmercar…

RabbitMQ個人理解與基本使用

目錄 一. 作用: 二. RabbitMQ的5中隊列模式: 1. 簡單模式 2. Work模式 3. 發布/訂閱模式 4. 路由模式 5. 主題模式 三. 消息持久化: 消息過期時間 ACK應答 四. 同步接收和異步接收: 應用場景 五. 基本使用 &#xff…

前端怎么預覽pdf

1.背景 后臺返回了一個在線的pdf地址,需要我這邊去做一個pdf的預覽(需求1),并且支持配置是否可以下載(需求2),需要在當前頁就能預覽(需求3)。之前我寫過一篇預覽pdf的文…

Python 參數配置使用 XML 文件的教程:輕松管理你的項目配置

Python 參數配置使用 XML 文件的教程:輕松管理你的項目配置 一句話總結:當配置項存儲在外部文件(如 XML、JSON)時,修改配置無需重新編譯和發布代碼。通過更新 XML 文件即可調整參數,無需更改源代碼&#xf…

解決 MySQL 啟動失敗與大小寫問題,重置數據庫

技術文檔:解決 MySQL 啟動失敗與大小寫問題,重置數據庫 1. 問題背景 在使用 MySQL 時,可能遇到以下問題: MySQL 啟動失敗,日志顯示 “permission denied” 或 “Can’t create directory” 錯誤。MySQL 在修改配置文…

python webdriver-manager 實現selenium 免下載安裝webdriver

python webdriver-manager 實現selenium 免下載安裝webdriver selenium在自動化測試中,通常需要使用瀏覽器驅動來與瀏覽器進行交互。然而,手動下載、安裝、以及管理這些驅動非常麻煩,尤其是當驅動版本頻繁更新時。為此,webdriver-manager庫提供了一個極簡的方案,自動幫我…

滑動窗口算法專題

滑動窗口簡介 滑動窗口就是利用單調性,配合同向雙指針來優化暴力枚舉的一種算法。 該算法主要有四個步驟 1. 先進進窗口 2. 判斷條件,后續根據條件來判斷是出窗口還是進窗口 3. 出窗口 4.更新結果,更新結果這個步驟是不確定的&#xff0c…

C# 中的Task

文章目錄 前言一、Task 的基本概念二、創建 Task使用異步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 關鍵字使用 Task.Wait 方法 四、處理 Task 的異常使用 try-catch 塊使用 Task.Exception 屬性 五、Task 的延續使用 ContinueWith 方法使用 await 關鍵字和異步方法…

【AIGC】如何高效使用ChatGPT挖掘AI最大潛能?26個Prompt提問秘訣幫你提升300%效率的!

還記得第一次使用ChatGPT時,那種既興奮又困惑的心情嗎?我是從一個對AI一知半解的普通用戶,逐步成長為現在的“ChatGPT大神”。這一過程并非一蹴而就,而是通過不斷的探索和實踐,掌握了一系列高效使用的技巧。今天&#…

浩辰CAD教程004:柱梁板

文章目錄 柱梁板標準柱角柱構造柱柱齊墻邊繪制梁繪制樓板 柱梁板 標準柱 繪制標準柱: ①:點選插入柱子②:沿著一根軸線布置柱子③:指定的矩形區域內的軸線交點插入柱子 替換現有柱子:選擇替換之后的柱子形狀&#x…