NumPy 通用函數(ufunc):高性能數組運算的利器

来源:https://www.cnblogs.com/xiaowange/p/18234056
-Advertisement-
Play Games

NumPy的通用函數(ufunc)提供高性能的逐元素運算,支持向量化操作和廣播機制,能應用於數組的數學、邏輯和比較運算。ufunc可提高計算速度,避免低效的迴圈,並允許自定義函數以滿足特定需求。例如,ufunc實現加法比迴圈更高效。通過`frompyfunc`可創建自定義ufunc。判斷函數是否為u... ...


NumPy 通用函數(ufunc)

簡介

NumPy 通用函數(ufunc),代表“通用函數”,是一類用於對 ndarray 對象進行逐元素運算的高性能函數。ufunc 使 NumPy 能夠在底層高效地利用 C 語言實現向量化操作,從而顯著提高計算速度。

優勢

ufunc 的主要優勢體現在以下幾個方面:

向量化操作: ufunc 可以對整個數組進行逐元素運算,避免了使用迴圈語句遍歷每個元素的低效率操作。
廣播機制: ufunc 支持廣播機制,能夠自動將不同形狀的數組廣播為相同形狀,方便進行運算。
多種函數類型: ufunc 包含了豐富的數學運算、邏輯運算和比較運算等,涵蓋了常見的數據處理需求。
靈活擴展: ufunc 支持自定義函數,可以根據需求創建新的 ufunc 來滿足特定場景的運算需求。

基本概念

向量化: 將原本需要使用迴圈語句逐個處理元素的操作,改為對整個數組進行操作,稱為向量化。
廣播: 在 NumPy 中,運算符可以對不同形狀的數組進行運算,規則是將數組廣播為相同的形狀,具體規則由數組的維度和 shape 屬性決定。

示例

加法運算

使用迴圈:

import numpy as np

x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])

z = []
for i, j in zip(x, y):
    z.append(i + j)

print(z)

使用 ufunc:

import numpy as np

x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])

z = np.add(x, y)
print(z)

解釋:

  • 在第一個示例中,使用 zip() 函數將 xy 數組中的元素一一對應,並使用 append() 函數將計算結果存儲在 z 列表中。
  • 在第二個示例中,直接使用 np.add() 函數對 xy 數組進行加法運算,並將結果存儲在 z 數組中。

ufunc 的優勢在於,它可以避免使用迴圈語句,直接對整個數組進行操作,效率更高。

創建自定義 ufunc

NumPy 允許用戶創建自定義的 ufunc,以滿足特定場景的運算需求。

步驟如下:

  1. 定義要封裝的運算函數:
    • 函數應接收任意數量的 ndarray 數組作為輸入參數。
    • 函數應返回一個或多個 ndarray 數組作為輸出結果。
  2. 使用 frompyfunc() 函數將自定義函數轉換為 ufunc:
    • frompyfunc() 函數接收以下參數:
      • function: 要轉換的自定義函數。
      • inputs: 輸入參數的數量。
      • outputs: 輸出結果的數量。
      • dtype: 可選參數,指定輸出數組的數據類型。

示例:創建自定義加法函數 myadd

import numpy as np

def myadd(x, y):
    return x + y

myadd = np.frompyfunc(myadd, 2, 1)

print(myadd([1, 2, 3, 4], [5, 6, 7, 8]))

解釋:

  • myadd 函數定義了自定義的加法運算邏輯。
  • np.frompyfunc()myadd 函數轉換為 ufunc,並指定其輸入參數為 2 個,輸出結果為 1 個。
  • 最後,調用 myadd ufunc 對兩個數組進行加法運算。

判斷函數是否是 ufunc

可以使用 type() 函數檢查函數的類型,如果結果為 numpy.ufunc,則該函數是 ufunc。

import numpy as np

print(type(np.add))

練習

  1. 使用 ufunc 實現數組的平方和平方根運算。
  2. 創建自定義 ufunc,用於計算兩個數組的元素之積並返回最大值。
  3. 比較使用 ufunc 和迴圈語句進行數組運算的性能差異。

解決方案

import numpy as np
import time

# 1. 使用 ufunc 實現數組的平方和平方根運算

x = np.random.rand(10000)

## 最後

為了方便其他設備和平臺的小伙伴觀看往期文章:

微信公眾號搜索:`Let us Coding`,關註後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關註

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是R哥。 最近,R哥分享了幾個特別有意思的面試輔導成功案例: 35K*14 薪入職了,這公司只要不裁員,我能一直呆下去。。 幹了 2 年多 Java 外包,終於脫離了! 輔導一周,連拿 3 個 Offer! 說到 985 學歷,找工作應該不算是什麼難事吧?何況還是 985 碩士? 這個學歷 ...
  • RuoYi-activiti —— 基於若依、Activiti 6.0,集流程設計、流程部署、流程執行、任務辦理、流程監控於一體的開源工作流開發平臺。 ...
  • 一、背景介紹 1.1 爬取目標 用python開發了一個抖音爬蟲採集軟體,可自動按博主抓取其已發佈視頻數據。 為什麼有了源碼還開發界面軟體呢?方便不懂編程代碼的小白用戶使用,無需安裝python,無需改代碼,雙擊打開即用! 軟體界面截圖: 爬取結果截圖: 結果截圖1: 結果截圖2: 結果截圖3: 以 ...
  • 寫在前面 這是PB案例學習筆記系列文章的第3篇,該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-proje ...
  • V1.0 2024年6月5日 發佈於博客園 目錄理論代碼伺服器端客戶端 理論 伺服器端先運行, 能夠接收來自任何地方的多個客戶端發起的指向特定埠(這裡是50002)的TCP請求, 並和客端建立穩定的TCP連接. 沒有連接請求時等待, 有連接後先來後到的原則, 依次服務, 能夠相互通信. 當客戶端結 ...
  • C-11.資料庫的設計規範 1.為什麼需要資料庫設計 我們在設計數據表的時候,要考慮很多問題。比如: 用戶需要什麼數據?需要在數據表中保存那些數據? 如何保證數據表中數據的正確性,當插入,刪除,更新的時候該進行怎樣的約束檢查? 如何降低數據表的數據冗餘度,保證數據表不會因為用戶量的增長而迅速擴張? ...
  • 在 ListNode dummy(0);ListNode* cur = &dummy; 中,& 是取地址運算符,用來獲取變數 dummy 的地址。具體如下: ListNode dummy(0);:創建了一個類型為 ListNode 的對象 dummy,其值初始化為 0。 &dummy:取 dummy ...
  • 最近又開始準備LLM 應用開發,要用到api key,才發現過我之前免費發放的額度沒了!我都沒咋用過,痛心! 現在 OpenAI 有要求必須充值 5 刀才能使用,問就是沒錢! 想著能不能在網上白嫖到共用api key。終於發現GitHub聖地的項目,拿來就用! 項目地址 直接點擊訪問。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...