大家知道數(shù)據(jù)分析中 Python 用到的最多的第三方庫(kù)便是 Numpy 了,它有著無(wú)可比擬的優(yōu)勢(shì),它提供的數(shù)據(jù)結(jié)構(gòu)比 Python 的更高級(jí)、更高效,可以說(shuō) Numpy 是 python 數(shù)據(jù)分析的基礎(chǔ)。
在標(biāo)準(zhǔn)的 Python 中,有個(gè)列表 list,我們知道 list 相當(dāng)于一個(gè)數(shù)組的結(jié)構(gòu),但是由于列表中 list 保存的是對(duì)象的指針。在 python 編程中省去了指針的概念,但是數(shù)組有指針。如果在 Python 中我保存一個(gè)數(shù)組 [0, 1, 2, 3],我需要 4 個(gè)指針和 4 個(gè)整數(shù)對(duì)象,這樣會(huì)浪費(fèi) python 的內(nèi)存和計(jì)算時(shí)間。
Python 列表結(jié)構(gòu)中的元素在系統(tǒng)中是分散存儲(chǔ)的,而 Numpy 數(shù)組存儲(chǔ)在一個(gè)均勻連續(xù)的內(nèi)存塊中。這樣數(shù)組元素遍歷所有的元素,不需要像 list 一樣對(duì)內(nèi)存地址進(jìn)行查找,大大地節(jié)省了計(jì)算單元。
Numpy 這么厲害,我們趕緊來(lái)學(xué)習(xí)吧!Numpy 中有兩個(gè)對(duì)象:1. ndarray (N-dimensional array object) 解決了多維數(shù)組問(wèn)題,而 ufunc ( universal function object) 可以對(duì)數(shù)組進(jìn)行處理。我們先從 ndarray 開(kāi)始。
ndarray
創(chuàng)建數(shù)組
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
b[1,2] = 90
print(a)
print(b)
print(a.shape)
print(b.shape)
print(a.dtype)
print(b.dtype)
運(yùn)行結(jié)果
[1 2 3 4]
[[ 1 2 3 4]
[ 5 6 90 8]
[ 9 10 11 12]]
(4,)
(3, 4)
int32
int32
我們先導(dǎo)入 numpy 庫(kù),記為 np。我們創(chuàng)建了一個(gè) a 數(shù)組,然后創(chuàng)建了一個(gè)多重?cái)?shù)組 b,b 數(shù)組中可以認(rèn)為一個(gè)數(shù)組作為一個(gè)元素,然后嵌套,例如 [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], 三個(gè)元素嵌套在 []
里面,賦值給變量 b。
通過(guò)函數(shù) shape 屬性獲得數(shù)組的大小,通過(guò) dtype 獲得元素屬性。修改數(shù)組中的元素直接賦值即可。
結(jié)構(gòu)數(shù)組
import numpy as np
persontype = np.dtype({
'names':['name', 'age', 'chinese', 'math', 'english'],
'formats':['S32', 'int', 'int', 'int', 'float']
})
peoples = np.array([('zhangsan', 20, 79, 88, 89), ('lisi', 21, 90, 97, 98.5),
('wangwu', 18, 99, 18, 90.5),],
dtype=persontype)
ages = peoples[:]['age']
chinese = peoples[:]['chinese']
math = peoples[:]['math']
english = peoples[:]['english']
print(np.mean(ages))
print(np.mean(chinese))
print(np.mean(math))
print(np.mean(english))
輸出結(jié)果
19.666666666666668
89.33333333333333
67.66666666666667
92.66666666666667
結(jié)構(gòu)數(shù)組中我們先定義了數(shù)組的類(lèi)型:persontype, 然后創(chuàng)建數(shù)組時(shí)直接指定了 dtype = persontype, 然后我們可以自由使用 persontype 了,想知道每個(gè)人的年齡,可以用 ages = peoples[:]['age'],最后我們用 np.mean() 求平均值。
unfnc 運(yùn)算
numpy 中 ufnc 函數(shù)運(yùn)算非???,因?yàn)槎际怯?C 語(yǔ)言實(shí)現(xiàn)的。
連續(xù)數(shù)組創(chuàng)建
x1 = np.arange(1, 15, 2)
x2 = np.linspace(1, 13, 7)
print(x1)
print(x2)
[ 1 3 5 7 9 11 13]
[ 1. 3. 5. 7. 9. 11. 13.]
可以看到那種方式的結(jié)果一樣,但是創(chuàng)建方式有所不同。
arange(), 通過(guò)指定初始值、終值、步長(zhǎng)、來(lái)創(chuàng)建等差數(shù)組的一維數(shù)組,默認(rèn)不包含終值。
linspace 是 linear space 的縮寫(xiě),linespace()通過(guò)指定初始值、終值、元素個(gè)數(shù)來(lái)創(chuàng)建等差數(shù)組的一維數(shù)組,包含終值。
數(shù)學(xué)運(yùn)算
x1 = np.arange(1, 15, 2)
x2 = np.linspace(1, 13, 7)
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)) # 取余
統(tǒng)計(jì)函數(shù)
想要對(duì)數(shù)據(jù)有更加清晰的認(rèn)識(shí),必須要用到統(tǒng)計(jì)函數(shù),如最大值、最小值、中位數(shù)、平均數(shù)、標(biāo)準(zhǔn)差等,下面我來(lái)為你一一講解。
最大值函數(shù) amax()、最小值函數(shù) amin()
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(a)
print(np.amin(a))
print(np.amin(a, 0))
print(np.amin(a, 1))
print(np.amax(a))
print(np.amax(a, 0))
print(np.amax(a, 1))
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
1
[1 2 3 4]
[1 5 9]
12
[ 9 10 11 12]
[ 4 8 12]
對(duì)于一個(gè)二維數(shù)組,np.amin(a) 是輸出數(shù)組中最小的數(shù),np.amin(a, 0) 是延著 axis = 0 軸的最小值,np.amin(a, 1) 是延著 axis = 1 的軸的最小值。axis = 0 表示跨行,axis = 1 表示跨列,即把元素看成 [1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]。
最大值與最小值之差 ptp()
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(np.ptp(a))
print(np.ptp(a, 0))
print(np.ptp(a, 1))
11
[8 8 8 8]
[3 3 3]
統(tǒng)計(jì)數(shù)組的百分位數(shù) percentile()
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(a)
print(np.percentile(a, 50))
print(np.percentile(a, 50, axis=0))
print(np.percentile(a, 50, axis=1))
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
6.5
[5. 6. 7. 8.]
[ 2.5 6.5 10.5]
percentile() 代表第 p 個(gè)百分位數(shù),p = 0, 代表求最小值,p = 50 代表求平均值, p = 100 代表求最大值。
統(tǒng)計(jì)數(shù)組里的中位數(shù) median()、平均數(shù) mean()
import numpy as np
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(np.median(a))
print(np.median(a, 0))
print(np.median(a, 1))
print(np.mean(a))
print(np.mean(a, 0))
print(np.mean(a, 1))
6.5
[5. 6. 7. 8.]
[ 2.5 6.5 10.5]
6.5
[5. 6. 7. 8.]
[ 2.5 6.5 10.5]
統(tǒng)計(jì)數(shù)組中的加權(quán)平均值 average()
b = np.array([1, 2, 3, 4])
weigh = np.array([1, 2, 3, 4])
print(np.average(b))
print(np.average(b, weights=weigh))
2.5
3.0
你可以指定權(quán)重?cái)?shù)組如 weigh = [1, 2, 3, 4], 結(jié)果為 (11+22+33+44)/ (1+2+3+4)= 3.0
標(biāo)準(zhǔn)差 std()、方差 var()
b = np.array([1, 2, 3, 4])
print(b.std())
print(b.var())
1.118033988749895
1.25
方差是每個(gè)數(shù)值與平均值之差的平方求和的平均值。標(biāo)準(zhǔn)差是方差的算術(shù)平方根,代表一組數(shù)據(jù)離平均值的分散程度。