在 NumPy 裡有兩個重要的物件:
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 語言實現的。
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() 通過指定初始值、終值、元素個數來建立等差數列的一維陣列,預設是包括終值的。
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)) # 取餘數
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]] 跨列 橫向