Python數據分析--Numpy常用函數介紹(7)--Numpy中矩陣和通用函數

来源:https://www.cnblogs.com/codingchen/archive/2022/06/08/16352881.html
-Advertisement-
Play Games

在NumPy中,矩陣是 ndarray 的子類,與數學概念中的矩陣一樣,NumPy中的矩陣也是二維的,可以使用 mat 、 matrix 以及 bmat 函數來創建矩陣。 一、創建矩陣 mat 函數創建矩陣時,若輸入已為 matrix 或 ndarray 對象,則不會為它們創建副本。 因此,調用 m ...


在NumPy中,矩陣是 ndarray 的子類,與數學概念中的矩陣一樣,NumPy中的矩陣也是二維的,可以使用 mat 、 matrix 以及 bmat 函數來創建矩陣。

一、創建矩陣

mat 函數創建矩陣時,若輸入已為 matrix 或 ndarray 對象,則不會為它們創建副本。 因此,調用 mat() 函數和調用 matrix(data, copy=False) 等價。

1) 在創建矩陣的專用字元串中,矩陣的行與行之間用分號隔開,行內的元素之間用空格隔開。使用如下的字元串調用 mat 函數創建矩陣:

import numpy as np

A = np.mat('1 2 3; 4 5 6; 7 8 9')
print("Creation from string:", A)

運行結果:

Creation from string: 
[[1 2 3]
 [4 5 6]
 [7 8 9]]

2)用T屬性獲取轉置矩陣

print("transpose A:", A.T)  # 用T屬性獲取轉置矩陣

3)用I屬性獲取逆矩陣

print("Inverse A:", A.I)  # 用I屬性獲取逆矩陣

4)用NumPy數組進行創建矩陣

B = np.mat(np.arange(9).reshape(3, 3))
print("Creation from array:", B)#使用NumPy數組進行創建

上述運行結果:

Creation from string: 
[[1 2 3] [4 5 6] [7 8 9]] transpose A:
[[
1 4 7] [2 5 8] [3 6 9]] Inverse A:
[[
3.15251974e+15 -6.30503948e+15 3.15251974e+15] [-6.30503948e+15 1.26100790e+16 -6.30503948e+15] [ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]] Creation from array:
[[0 1 2] [3 4 5] [6 7 8]]

二、從已有矩陣創建新矩陣

希望利用一些已有的較小的矩陣來創建一個新的大矩陣。這可以用 bmat 函數來實現。這裡的 b 表示“分塊”, bmat 即分塊矩陣(block matrix)。

1)先創建一個3*3的單位矩陣:

C = np.eye(3)
print("C:",C)

運行結果:

C: 
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

2)創建一個與C同型的矩陣,乘以2

D = 2 * C
print ("D:",D)

運行結果:

D: 
[[2. 0. 0.] [0. 2. 0.] [0. 0. 2.]]

3)使用字元串創建複合矩陣:

字元串的格式與 mat 函數中一致,只是在這裡你可以用矩陣變數名代替數字:

print("Compound matrix\n", np.bmat("C D;C D"))

運行結果:

Compound matrix:
 [[1. 0. 0. 2. 0. 0.]
 [0. 1. 0. 0. 2. 0.]
 [0. 0. 1. 0. 0. 2.]
 [1. 0. 0. 2. 0. 0.]
 [0. 1. 0. 0. 2. 0.]
 [0. 0. 1. 0. 0. 2.]]

三、通用函數

通用函數的輸入是一組標量,輸出也是一組標量,它們通常可以對應於基本數學運算,如加、減、乘、除等。

1、使用NumPy中的 frompyfunc 函數,通過一個Python函數來創建通用函數,步驟如下:

1)定義一個回答某個問題的Python函數

2)用 zeros_like 函數創建一個和 a 形狀相同,並且元素全部為0的數組 result

3)將剛生成的數組中的所有元素設置其值為42

2、在 add 上調用通用函數的方法

通用函數並非真正的函數,而是能夠表示函數的對象。通用函數有四個方法,不過這些方法只對輸入兩個參數、輸出一個參數的ufunc對象有效,例如 add 函數。

其他不符合條件的ufunc對象調用這些方法時將拋出 ValueError 異常。因此只能在二元通用函數上調用這些方法。以下將逐一介紹這4個方法:

 reduce()、accumulate()、 reduceat()、outer()

1) 沿著指定的軸,在連續的數組元素之間遞歸調用通用函數,即可得到輸入數組的規約(reduce)計算結果。

對於 add 函數,其對數組的reduce計算結果等價於對數組元素求和。調用reduce 方法:

a = np.arange(9)
print("Reduce:", np.add.reduce(a)) #調用add函數的reduce方法

運行結果:

Reduce 36

2) accumulate 方法同樣可以遞歸作用於輸入數組

在 add 函數上調用 accumulate 方法,等價於直接調用 cumsum 函數。在 add 函數上調用 accumulate 方法:

print( "Accumulate", np.add.accumulate(a)) #調用add函數的accumulate方法

運行結果:

Accumulate [ 0  1  3  6 10 15 21 28 36]

3)educeat 方法需要輸入一個數組以及一個索引值列表作為參數。

print ("Reduceat", np.add.reduceat(a, [0, 5, 2, 7]))

educeat 方法的作用是,在數列a中,分別計算索引間的累加,比如上述的 [0, 5, 2, 7],分別計算索引0-5,5-2(5>2,所以直接取索引為5的數據),2-7,7-(-1) 等四組序列形成的

比如,0-5就是計算A-E列中的數據,結果為10;5-2,直接取索引為5,即F的數據5;2-7,即B-G的計算結果為20;7-(-1)即索引7到最後,也即H、I的計算結果為15。

4)outer 方法

返回一個數組,它的秩(rank)等於兩個輸入數組的秩的和。它會作用於兩個輸入數組之間存在的所有元素對。在 add 函數上調用 outer 方法:

print("Outer:\n", np.add.outer(np.arange(3), a))

運行結果:

Outer:
 [[ 0  1  2  3  4  5  6  7  8]
 [ 1  2  3  4  5  6  7  8  9]
 [ 2  3  4  5  6  7  8  9 10]]

四、算術運算

在NumPy中,基本算術運算符+、-和 * 隱式關聯著通用函數 add 、 subtract 和 multiply ,對NumPy數組使用這些算術運算符時,對應的通用函數將自動被調用。除法包含

的過程則較為複雜,在數組的除法運算中涉及

三個通用函數 divide 、 true_divide 和floor_division ,以及兩個對應的運算符 / 和 // 。
1、除法運算:

import numpy as np

a = np.array([2, 6, 5])
b = np.array([1, 2, 3])

print("Divide:\n", np.divide(a, b), np.divide(b, a))

 除了divide()函數外,還有floor_divide(),以及運算符‘/’和‘//’,(‘/’和‘//’分別和divide和floor_divide作用一樣)如下代碼:

import numpy as np

a = np.array([2, 6, 5])
b = np.array([1, 2, 3])

print("Divide:\n", np.divide(a, b), np.divide(b, a))
print("True Divide:\n", np.true_divide(a, b), np.true_divide(b, a))#回除法的浮點數結果而不作截斷

print("Floor Divide:\n", np.floor_divide(a, b), np.floor_divide(b, a))  #返回整數結果
c = 3.14*b
print("Floor Divide2:\n", np.floor_divide(c, b), np.floor_divide(b, c)) #返回整數結果

print( "/ operator:\n", a/b, b/a)  # "/"運算符相當於調用 divide 函數

print( "// operator:\n", a//b, b//a) #運算符//對應於floor_divide 函數
print( "// operator2:\n", c//b, b//c) 

運行結果:

Divide:
 [2.         3.         1.66666667] [0.5        0.33333333 0.6       ]
True Divide:
 [2.         3.         1.66666667] [0.5        0.33333333 0.6       ]
Floor Divide:
 [2 3 1] [0 0 0]
Floor Divide2:
 [3. 3. 3.] [0. 0. 0.]
/ operator:
 [2.         3.         1.66666667] [0.5        0.33333333 0.6       ]
// operator:
 [2 3 1] [0 0 0]
// operator2:
 [3. 3. 3.] [0. 0. 0.]

 2、模運算

計算模數或者餘數,可以使用NumPy中的 mod 、 remainder 和 fmod 函數。當然,也可以使用 % 運算符。這些函數的主要差異在於處理負數的方式。

a = np.arange(-4, 4)
print('a:',a)
print ("Remainder", np.remainder(a, 2)) # remainder 函數逐個返回兩個數組中元素相除後的餘數
print ("Mod", np.mod(a, 2))  # mod 函數與 remainder 函數的功能完全一致
print ("% operator", a % 2)  # % 操作符僅僅是 remainder 函數的簡寫

print ("Fmod", np.fmod(a, 2))# fmod 函數處理負數的方式與 remainder 、 mod 和 % 不同

運行結果:

a: [-4 -3 -2 -1  0  1  2  3]
Remainder [0 1 0 1 0 1 0 1]
Mod [0 1 0 1 0 1 0 1]
% operator [0 1 0 1 0 1 0 1]
Fmod [ 0 -1  0 -1  0  1  0  1]

實際代碼運行如下:

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 哈工大軟體構造課程中重寫與重載的複習總結,可供後來學子借鑒學習 ...
  • Servlet學習筆記 Servlet學習 學習視頻為:https://www.bilibili.com/video/BV1Ta4y1H7Vc IDEA的使用 IDEA的簡介 IDEA 全稱 IntelliJ IDEA,由JetBrains公司開發,是java編程語言開發的集成環境。在業界被公認為最 ...
  • hello,大家好呀,我是小樓! 今天給大家帶來一篇關於Dubbo IO交互的文章,本文是一位同事寫的文章,用有趣的文字把枯燥的知識點寫出來,通俗易懂,非常有意思,所以迫不及待找作者授權然後分享給大家: 一些有趣的問題 Dubbo是一個優秀的RPC框架,其中有錯綜複雜複雜的線程模型,本篇文章筆者從自 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • KeyStore(譯:密鑰存儲庫) 代表用於加密密鑰和證書的存儲設施。 KeyStore 管理不同類型的 entry(譯:條目)。每種類型的 entry 都實現了 KeyStore.Entry 介面。提供了三個基本的 KeyStore.Entry 實現: KeyStore.PrivateKeyEnt ...
  • 下載任務類設計 /** * 下載任務執行器 * @author Shixy */ @Slf4j public class Downloader implements Runnable { private String filePath; private Callable<String> callab ...
  • vector是一個常被使用的容器,本文對如何使用它進行初步的介紹。 ...
  • mkcert(Windows環境) 1.下載地址:https://github.com/FiloSottile/mkcert/releases 2.選擇版本 3.以管理員身份運行`命令提示符 1) cd C:/ #進入工具存放的目錄下 2) mkcert-v1.4.4-windows-amd64.e ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...