numpy庫 系列知識點總結

2020-08-09 14:33:55

在 NumPy 裡有兩個重要的物件:

  • ndarray(N-dimensional array object)解決了多維陣列問題
  • ufunc(universal function object)是解決對陣列進行處理的函數。

ndarray 物件
ndarray 實際上是多維陣列的含義。在 NumPy 陣列中,維數稱爲秩(rank),一維陣列的秩爲 1,二維陣列的秩爲 2,以此類推。在 NumPy 中,每一個線性的陣列稱爲一個軸(axes),其實秩就是描述軸的數量。

  • 建立陣列
import numpy as np #匯入庫
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b[1,1]=10 #修改陣列
print (a.shape) #檢視陣列大小
print (b.shape)
print (a.dtype) #檢視陣列屬性
print (b)

在这里插入图片描述

  • 結構陣列
import numpy as np
persontype = np.dtype({
    'names':['name', 'age', 'chinese', 'math', 'english'],
    'formats':['S32','i', 'i', 'i', 'f']})
peoples = np.array([("ZhangFei",32,75,100, 90),("GuanYu",24,85,96,88.5),
       ("ZhaoYun",28,85,92,96.5),("HuangZhong",29,65,85,100)],
    dtype=persontype)
ages = peoples[:]['age']
chineses = peoples[:]['chinese']
maths = peoples[:]['math']
englishs = peoples[:]['english']
print (np.mean(ages))
print (np.mean(chineses))
print (np.mean(maths))
print (np.mean(englishs))

在这里插入图片描述
首先在 NumPy 中是用 dtype 定義的結構型別,然後在定義陣列的時候,用 array 中指定了結構陣列的型別 dtype=persontype,這樣你就可以自由地使用自定義的 persontype 了。比如想知道每個人的語文成績,就可以用 chineses = peoples[:][‘chinese’],當然 NumPy 中還有一些自帶的數學運算,比如計算平均值使用 np.mean。

ufunc 運算
ufunc 是 universal function 的縮寫,它能對陣列中每個元素進行函數操作。NumPy 中很多 ufunc 函數計算速度非常快,因爲都是採用 C 語言實現的。

  • 連續陣列的建立
    NumPy 可以很方便地建立連續陣列,比如我使用 arange 或 linspace 函數進行建立:
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)

np.arange 和 np.linspace 起到的作用是一樣的,都是建立等差陣列。這兩個陣列的結果 x1,x2 都是[1 3 5 7 9]。結果相同,但是你能看出來建立的方式是不同的。

arange() 類似內建函數 range(),通過指定初始值、終值、步長來建立等差數列的一維陣列,預設是不包括終值的

linspace 是 linear space 的縮寫,代表線性等分向量的含義。linspace() 通過指定初始值、終值、元素個數來建立等差數列的一維陣列,預設是包括終值的

  • 算術運算
    通過 NumPy 可以自由地建立等差陣列,同時也可以進行加、減、乘、除、求 n 次方和取餘數。
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
print(x1)
print(x2)
print(np.add(x1, x2)) # 相加
print(np.subtract(x1, x2))  # 相減
print(np.multiply(x1, x2))  # 相乘
print(np.divide(x1, x2))  # 相除

print(np.power(x1, x2))  # 求n次方
print(np.remainder(x1, x2))  # 取餘數
print(np.mod(x1, x2))  # 取餘數

在这里插入图片描述

  • 統計函數
    如果你想要對一堆數據有更清晰的認識,就需要對這些數據進行描述性的統計分析,比如瞭解這些數據中的最大值、最小值、平均值,是否符合正態分佈,方差、標準差多少等等。它們可以讓你更清楚地對這組數據有認知。
    計陣列 / 矩陣中的最大值函數 max(),最小值函數 min()
import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.min(a))  # 全部元素最小值 1
print(np.min(a, 0))  # axis=0軸的最小值 [1, 2, 3,]
print(np.min(a, 1))  # axis=1軸的最小值 將陣列視爲 [1,4,7], [2,5,8], [3,6,9]三個元素 [1, 4, 7]
print(np.max(a))  # 全部元素最大值 1
print(np.max(a, 0))  # axis=0軸的最大值 [7, 8, 9,]
print(np.max(a, 1))  # axis=1軸的最大值 將陣列視爲 [1,4,7], [2,5,8], [3,6,9]三個元素 [1, 4, 7]

在这里插入图片描述
統計最大值與最小值之差 ptp()

a = np.array([[1,2,3], [4,5,6], [7,8,9]])
print (np.ptp(a))
print (np.ptp(a,0))# axis=0軸的最大值 [7, 8, 9,] 最小值[1,2,3]
print (np.ptp(a,1))#axis=1軸的最大值[3,6,9],最小值[1,4,7]

在这里插入图片描述
統計陣列的百分位數 percentile()

import numpy as np

# percentile()代表着第 p 個百分位數,這裏p的取值範圍是0-100,如果p=0,那麼就是求最小值,如果p=50就是求平均值,如果p=100就是求最大值。
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.percentile(a, 50))  # 5.0
print(np.percentile(a, 50, axis=0))  # [4, 5, 6]
print(np.percentile(a, 50, axis=1))  # [2, 5, 8]

在这里插入图片描述
統計陣列中的中位數 median()、平均數 mean()

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 求中位數
print(np.median(a))  # 5.0
print(np.median(a, axis=0))  # [4. 5. 6.]
print(np.median(a, axis=1))  # [2. 5. 8.]
# 求平均數
print(np.mean(a))  # 5.0
print(np.mean(a, axis=0))  # [4. 5. 6.]
print(np.mean(a, axis=1))  # [2. 5. 8.]

在这里插入图片描述
統計陣列中的加權平均值 average()

import numpy as np
# 求加權平均數
a1 = np.array([1, 2, 3, 4])
wts = np.array([1, 2, 3, 4])
print(np.average(a1))  # 2.5
print(np.average(a1, weights=wts))  # weights 爲設定加權的權重 3.0

average() 函數可以求加權平均,加權平均的意思就是每個元素可以設定個權重,預設情況下每個元素的權重是相同的,所以 np.average(a)=(1+2+3+4)/4=2.5,你也可以指定權重陣列 wts=[1,2,3,4],這樣加權平均 np.average(a,weights=wts)=(11+22+33+44)/(1+2+3+4)=3.0。

統計陣列中的標準差 std()、方差 var()

import numpy as np
# 求加權平均數
a = np.array([1, 2, 3, 4])
# 標準差及方差
print(np.std(a))  # 1.118033988749895
print(np.var(a))  # 1.25

方差的計算是指每個數值與平均值之差的平方求和的平均值,即 mean((x - x.mean())** 2)。標準差是方差的算術平方根。在數學意義上,代表的是一組數據離平均值的分散程度。所以 np.var(a)=1.25, np.std(a)=1.118033988749895。

NumPy 排序
排序演算法在 NumPy 中實現起來其實非常簡單,一條語句就可以搞定。這裏可以使用 sort 函數,sort(a, axis=-1, kind=‘quicksort’, order=None),預設情況下使用的是快速排序;

在 kind 裡,可以指定 quicksort、mergesort、heapsort 分別表示快速排序、合併排序、堆排序。同樣 axis 預設是 -1,即沿着陣列的最後一個軸進行排序,也可以取不同的 axis 軸,或者 axis=None 代表採用扁平化的方式作爲一個向量進行排序。另外 order 欄位,對於結構化的陣列可以指定按照某個欄位進行排序。

import numpy as np

a = np.array([[4, 3, 2], [2, 4, 1]])
print(np.sort(a))  # 預設從小到大排序
print(np.sort(a, axis=None))  # axis爲none會將陣列降爲一維 [1 2 2 3 4 4]
print(np.sort(a, axis=0))  # [[2 3 1],[4 4 2]] 跨行 縱向

print(np.sort(a, axis=1))  # [[2 3 4],[1 2 4]] 跨列 橫向