NumPy——統計函數

来源:https://www.cnblogs.com/hashcoin/archive/2020/03/03/12405252.html
-Advertisement-
Play Games

引入模塊 1. /`a.sum(axis=None)` 根據給定軸 計算數組 相關元素之和, 整數或元組,不指定軸則預設求全部元素之和。 若 的`shape (d0,d1,..,dn) axis=(m1,m2,...mi) shape (d0,d1,...,dn) (dm1,dm2,...dmi) ...


引入模塊import numpy as np

1.numpy.sum(a, axis=None)/a.sum(axis=None)

根據給定軸axis計算數組a相關元素之和,axis整數或元組,不指定軸則預設求全部元素之和。

ashape(d0,d1,..,dn),當axis=(m1,m2,...mi)時,返回結果應是一個shape(d0,d1,...,dn)-(dm1,dm2,...dmi),每個元素是軸m1,m2,...mi上元素之和

例:

a = np.arange(24).reshape((2, 3, 4))
print("數組a:\n", a)
print("np.sum(a):", np.sum(a))                   # 全部元素和
print("np.sum(a, axis=0):\n", np.sum(a, axis=0))   # 第0軸(最外圍)的元素和
print("np.sum(a, axis=1):\n", np.sum(a, axis=1))    # 第1軸元素和
print("np.sum(a, axis=(0, 1)):\n", np.sum(a, axis=(0, 1)))  # 第0軸和第1軸元素之和
print("np.sum(a, axis=(0, 2)):\n", np.sum(a, axis=(0, 2)))  # 第0軸和第2軸元素之和

輸出:

數組a:
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
  
np.sum(a): 276

np.sum(a, axis=0):
 [[12 14 16 18]         # 0+12=12 1+13=14 ...
 [20 22 24 26]          # 4+16=20 5+17=22
 [28 30 32 34]]
 
np.sum(a, axis=1):
 [[12 15 18 21]         # 0+4+8=12 1+5+9=15 ...
 [48 51 54 57]]         # 12+16+20=48 13+17+21=51
 
 np.sum(a, axis=(0, 1)):
 [60 66 72 78]          # 0+4+8+12+16+20=60 1+5+9+13+17+21=66...
 
np.sum(a, axis=(0, 2)):
 [ 60  92 124]          # 0+1+2+3+12+13+14+15=60 4+5+6+7+16+17+18+19=92....

2.numpy.mean(a, axis=None)/a.mean(axis=None)`

根據給定軸axis計算數組a相關元素的平均值axis整數或元組。

不指定axis,預設求所有元素平均值。指定axis,求指定軸上元素平均值。

ashape(d0,d1,..,dn),當axis=(m1,m2,...mi)時,返回結果應是一個shape(d0,d1,...,dn)-(dm1,dm2,...dmi),每個元素是軸m1,m2,...mi上所有元素的平均值

例:

print("數組a:\n", a)
print("np.mean(a):", np.mean(a))    # 全部元素的平均值
print("np.mean(a, axis=0):\n", np.mean(a, axis=0))  # 0軸上的平均值
print("np.mean(a, axis=(0, 2)):\n", np.mean(a, axis=(0, 2)))    # 0軸和2軸平均值

輸出:

數組a:
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
np.mean(a): 11.5
np.mean(a, axis=0):
 [[ 6.  7.  8.  9.]         # (0+12)/2=6 (1+13)/2=7...
 [10. 11. 12. 13.]          # (4+16)/2=10 (5+17)/2=11...
 [14. 15. 16. 17.]]         # (8+20)/2=14 (9+21)/2=15..
np.mean(a, axis=(0, 2)):
 [ 7.5 11.5 15.5]           # (0+1+2+3+12+13+14+15)/2=7.5..

3.numpy.average(a,axis=None,weights=None)

根據給定軸axis計算數組a相關元素的加權平均值,

weights是一個權重數組,形狀應與給定數組ashape相同,即:weights.shape=a.shape或者在指定一個軸axis時,weight則應是一個一維數組,數組元素個數與指定軸維度數相同。

當不指定weigts時,此時即為求平均值,效果同.mean相同

例:

print("數組a:\n", a)
print("np.average(a, axis=0):\n", np.average(a, axis=0))
print("np.average(a, axis=0, weights=[10, 1]):\n", np.average(a, axis=0, weights=[10, 1]))
wei = np.random.randint(1, 60, (2, 3, 4 ))
print("權重數組是:", wei)
print("np.average(a, axis=(0, 2), weights=wei):\n", np.average(a, axis=(0, 2), weights=wei))

輸出:

數組a:
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
np.average(a, axis=0):
 [[ 6.  7.  8.  9.]
 [10. 11. 12. 13.]
 [14. 15. 16. 17.]]
np.average(a, axis=0, weights=[10, 1]):
 [[ 1.09090909  2.09090909  3.09090909  4.09090909] # (0*10+12*1)/(10+1)=1.0909
 [ 5.09090909  6.09090909  7.09090909  8.09090909]  # (4*10+16*1)/(10+1)=5.0909
 [ 9.09090909 10.09090909 11.09090909 12.09090909]]
權重數組是: [[[37  5 50  9]
  [ 9 40 17 42]
  [45  4 41 29]]

 [[17 24 29 37]
  [20  8 14 37]
  [ 3  1 48 14]]]
np.average(a, axis=(0, 2), weights=wei):
 [ 7.73557692 10.92513369 13.96756757]  # (0*37+1*5+2*50+3*9+12*17+13*24+14*29+15*37)/(37+5+50+9+17+24+29+37)=7.7355

4.numpy.std(a,axis=None)/a.std(axis=None)       numpy.var(a,axis=None)/a.var(axis=None)

.std(a,axis=None)根據給定軸axis計算數組a相關元素的總體標準差(要與樣本標準差區分)

即:\(\sigma=\sqrt{{\frac 1N}\sum_{i=1}^N(x_i-\overline x)^2}\)

(Standard Deviation)——std標準差,又稱均方差

.var(a,axis=None)根據給定軸axis計算數組a相關元素的總體方差

即:\(\sigma^2={\frac {\sum_{i=1}^N(x_i-\overline x)^2}N}\)

variance——var方差

b = np.random.randint(1, 30, (2, 3, 4))
print("數組b:\n", b)
print("np.std(b, axis=2):\n", np.std(b, axis=2))    # 標準差
print("np.var(b, axis=2):\n", np.var(b, axis=2))    # 方差

輸出:

數組b:
 [[[16  8 27 24]
  [12 15 25  8]
  [11 19 15 26]]

 [[29 15 18 24]
  [17  8  4 15]
  [ 2 28 10 21]]]
np.std(b, axis=2):
 [[7.39509973 6.28490254 5.53962995]
 [5.40832691 5.24404424 9.98436277]]
np.var(b, axis=2):
 [[54.6875 39.5    30.6875]
 [29.25   27.5    99.6875]]

我們來檢驗一下,例如,對2軸中12 15 25 8這組數據進行求標準差:

均值為:\(\overline x=15\)

則樣本標準差為:\(\sigma=\sqrt{\frac {(12-15)^2+(15-15)^2+(25-15)^2+\left(8-15\right)^2}{4}}=\sqrt{39.5}\approx6.284902544988\)

方差為:\(\sigma^2=39.5\)

5.最值函數

numpy.amin(a,axis=None)/numpy.min(a,axis=None)/a.min(axis=None)

返回軸axis上的最小值,若不指定軸,預設返回所有元素最小值

numpy.amax(a,axis=None)/numpy.max(a,axis=None)/a.max(axis=None)

返回軸axis上的最大值,若不指定軸,預設返回所有元素最大值

例:

c = np.random.randint(1, 60, (2, 3, 4))
print("數組c:\n", c)
print("np.min(c):     ", np.min(c))
print("np.amin(c, axis=1):\n", np.amin(c, axis=1))
print("c.min(axis=2): \n", c.min(axis=2))
print("-"*20 + '分割線' + '-'*20)
print("np.max(c):    ", np.max(c))
print("np.amax(c, axis=1):\n", np.amax(c, axis=1))
print("c.max(axis=2):\n", c.max(axis=2))

輸出:

數組c:
 [[[15 50 24  6]
  [ 2  8 27 53]
  [52 23  9 35]]

 [[17 38 42 20]
  [ 4 32  9 17]
  [48 39 17 40]]]
np.min(c):      2
np.amin(c, axis=1):
 [[ 2  8  9  6]
 [ 4 32  9 17]]
c.min(axis=2): 
 [[ 6  2  9]
 [17  4 17]]
--------------------分割線--------------------
np.max(c):     53
np.amax(c, axis=1):
 [[52 50 27 53]
 [48 39 42 40]]
c.max(axis=2):
 [[50 53 52]
 [42 32 48]]

嚴格的說,a.min等並不是NumPy庫的函數


6.最值下標

numpy.argmin(a,axis=None)/a.argmin(axis=None)

返回數組指定軸上最小值降成一維後的相對坐標

numpy.argmax(a,axis=None)/a.argmax(axis=None)

返回數組指定軸上最大值降成一維後的相對坐標

例:

print("數組c:\n", c)
print("c.argmax():  ", c.argmax())
print("np.argmax(c, axis=2):\n", np.argmax(c, axis=2))
print("-"*20 + '分割線' + '-'*20)
print("np.argmin(c):  ", np.argmin(c))
print("c.argmin(axis=1):\n", c.argmin(axis=1))

輸出:

數組c:
 [[[50 44 13 16]
  [26 23 31 35]
  [ 5 21 42  8]]

 [[ 6 53 10 57]
  [14  5 18 38]
  [40 31  4 55]]]
c.argmax():   15        # 降一維後57下標是15
np.argmax(c, axis=2):
 [[0 3 2]               # 在軸2上,50-0 35-3 42-2  57-3  38-3  55-3
 [3 3 3]]
--------------------分割線--------------------
np.argmin(c):   22
c.argmin(axis=1):
 [[2 2 0 2]
 [0 1 2 1]]

7.numpy.unravel_index(index, shape)

根據shape將一維下標index轉換成多維下標(對應shape的下標),與6中的argmax,argmin配合使用

例:

print("數組c:\n", c)
print(np.unravel_index(np.argmax(c), c.shape))

輸出:

 [[[22  4 28 56]
  [45 34  3 22]
  [59 43 43 27]]

 [[32 35 47 53]
  [ 7 27 41 18]
  [40 32 30 43]]]
(0, 2, 0)           # 59是數組最大值,其索引坐標為(0,2,0)

8.numpy.median(a,axis=None)

返回數組在指定軸上的中位數(中值),若不指定軸,預設返回全部元素中位數

例:

print("數組c:\n", c)
print("np.median(c):  ", np.median(c))

輸出:

[[[17 59 14 23]
  [27 59  6 12]
  [43 16 27 17]]

 [[12 10  5 17]
  [21 55 18 42]
  [41 36 40  5]]]
np.median(c):   19.5

9.其他函數

numpy.ptp(a,axis=None)/a.ptp(a,axis=None)

計算指定軸上最大值與最小值的差,若不指定axis,預設為全部元素

例:

print("np.ptp(c):  ", np.ptp(c))
print("c.ptp(axis=1):\n", c.ptp(axis=1))

輸出:

數組c:
 [[[35 28 18 38]
  [44 56  7 24]
  [ 4 59  2 24]]

 [[55 56  5 27]
  [18 44 22  1]
  [ 3 30 20 43]]]
np.ptp(c):   58     #   59-1=58
c.ptp(axis=1):
 [[40 31 16 14]     # 44-4=40 59-28=31 ...
 [52 26 17 42]]

numpy.percentile(a, q, axis=None)

  1. a:輸入數組
  2. q:要計算的百分位數,在0~100之間
  3. axis:計算百分位數的軸

返回一個數,滿足至少有q%的數小於或等於該值,且至少有(100-q)%的數大於或等於該值。

例:

d = np.random.randint(1, 40, (2, 5))
print("數組d:\n", d)
print("np.percentile(d, 40):    ", np.percentile(d, 40))
print("np.percentile(d, 40, axis=1):\n", np.percentile(d, 40, axis=1))

輸出:

數組d:
 [[39 15 35 17 39]
 [20 12 36 19 10]]
np.percentile(d, 40):     18.200000000000003    
np.percentile(d, 40, axis=1):
 [27.8 16.2]              

很多函數參數列表中都有keepdims=Falsekeepdims是保持數組維度特性,如果keepdimsTrue,則返回仍會用多維數組[]包含

參考資料

奇客谷——NumPy統計函數

官方文檔—統計函數

官方文檔—排序、搜索和計數


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

-Advertisement-
Play Games
更多相關文章
  • 近日,微軟發佈了.NET Core 2.0,但是開發人員中間仍然存在一些疑惑,就是.NET Core、.NET Standard、Xamarin和.NET Framework有什麼不同。 .NET Framework用於構建桌面應用程式和運行在互聯網信息伺服器(IIS)上的ASP.NET應用程式。它 ...
  • 選擇題 題目1(單選): 下列選項中定義變數哪一項是正確的(D ) 選項: A.byte b=128; B.long c=3.14L; C.float f=3.14; D.double e=4.88; 題目2(單選): 關於變數的定義,下列寫法正確的是( A ) 選項: A. byte b = 10 ...
  • 選題題 題目1(單選): 下麵有關Java語言跨平臺性說法正確的是(D ) 選項 : A.Java的源代碼是跨平臺的。 B.JDK是跨平臺的。 C.JVM是跨平臺的。 D.跨平臺中的平臺指的是操作系統,Java語言的跨平臺性是指Java程式可以在不同的操作系統上運行,前提是相應的操作系統安裝了對應的 ...
  • 開發環境: Windows操作系統開發工具:Myeclipse+Jdk+Tomcat7+MYSQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=138 ...
  • 開發環境: Windows操作系統開發工具:Myeclipse/eclipse+Jdk+Tomcat+MYSQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=137 ...
  • "參考文章鏈接" 我的環境 conda 4.7.10、python 3.6.7、Django 3.0.3 安裝uWSGI 這裡如果出現了問題,可以考慮如下解決辦法: "參考鏈接" 最後重新運行安裝命令 測試uWSGI是否正常工作 新建一個test.py文件: 若之後要刪除則運行 輸入如下內容: 運行 ...
  • Tornado 是 FriendFeed 使用的可擴展的非阻塞式 web 伺服器及其相關工具的開源版本。這個 Web 框架看起來有些像web.py 或者 Google 的 webapp,不過為了能有效利用非阻塞式伺服器環境,這個 Web 框架還包含了一些相關的有用工具 和優化。 Tornado 和現 ...
  • 在實際的開發過程中,我們需要前端頁面向Java端提交請求,這些請求一般分為get方式和post方式,不管是哪一種方式,一般都會攜帶一些參數。這一節,我們來演示一下如何給Controller傳遞參數。 代碼: @RestController public class HelloController { ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...