數(shù)據(jù)分析 - Numpy(看這篇就夠了)

大家知道數(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ù)離平均值的分散程度。

給我點(diǎn)個(gè)贊,助我長(zhǎng)期寫(xiě)下去。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 來(lái)源:NumPy Tutorial - TutorialsPoint 譯者:飛龍 協(xié)議:CC BY-NC-SA 4...
    布客飛龍閱讀 33,608評(píng)論 6 97
  • 介紹 NumPy 是一個(gè) Python 包。 它代表 “Numeric Python”。 它是一個(gè)由多維數(shù)組對(duì)象和...
    喔蕾喔蕾喔蕾蕾蕾閱讀 1,877評(píng)論 0 5
  • 前言 numpy是支持 Python語(yǔ)言的數(shù)值計(jì)算擴(kuò)充庫(kù),其擁有強(qiáng)大的高維度數(shù)組處理與矩陣運(yùn)算能力。除此之外,nu...
    開(kāi)發(fā)者也閱讀 3,409評(píng)論 0 35
  • numpy.random.randint Return random integers fromlow(inclu...
    onepedalo閱讀 1,312評(píng)論 0 1
  • 今天是10月5號(hào),是中秋過(guò)后的第一天。 都說(shuō)十五的月亮十六圓,可是我今天也沒(méi)有見(jiàn)到!今天,我們?cè)谏介g穿梭,穿過(guò)了祁...
    山榛隰苓閱讀 395評(píng)論 0 0

友情鏈接更多精彩內(nèi)容