在極客時(shí)間上買了陳旸老師的數(shù)據(jù)分析實(shí)戰(zhàn)45講,以下是第二周對(duì)于專欄內(nèi)容的概括、思考和對(duì)實(shí)戰(zhàn)項(xiàng)目的記錄。
4.15 周一
03 |? Python的基礎(chǔ)語(yǔ)法
包括輸入輸出,for/while循環(huán),列表、元組、字典和集合,注釋、引用和函數(shù)
浙江大學(xué)ACM答題網(wǎng)址,這是浙江大學(xué)ACM?的?OnlineJudge。
04 | Numpy快速處理數(shù)據(jù)
Numpy數(shù)組存儲(chǔ)在一個(gè)均勻連續(xù)的內(nèi)存塊中,而列表list在內(nèi)存中是分散的,所以Numpy不像list還需要對(duì)內(nèi)存地址進(jìn)行查找,從而節(jié)省了計(jì)算資源。
Numpy里有兩個(gè)重要對(duì)象:ndarray(N-dimensional array object)解決了多維數(shù)組的問(wèn)題,ufunc(universal function object)則是對(duì)數(shù)組進(jìn)行處理的函數(shù)。
ndarray對(duì)象:
ndarray是多維數(shù)組的含義,每一個(gè)線性的數(shù)組成為一個(gè)軸(axes),axes=0是跨行(縱向),axes=1是跨列(橫向)
一些已經(jīng)會(huì)的東西,不再贅述。
ufunc對(duì)象:
NumPy 可以很方便地創(chuàng)建連續(xù)數(shù)組,比如我使用 arange 或 linspace 函數(shù)進(jìn)行創(chuàng)建:np.arange 和 np.linspace 起到的作用是一樣的,都是創(chuàng)建等差數(shù)組。這兩個(gè)數(shù)組的結(jié)果x1,x2 都是 [1 3 5 7 9]。結(jié)果相同,但是你能看出來(lái)創(chuàng)建的方式是不同的。arange() 類似內(nèi)置函數(shù) range(),通過(guò)指定初始值、終值、步長(zhǎng)來(lái)創(chuàng)建等差數(shù)列的一維數(shù)組,默認(rèn)是不包括終值的。
linspace 是 linear space 的縮寫(xiě),代表線性等分向量的含義。linspace() 通過(guò)指定初始值、終值、元素個(gè)數(shù)來(lái)創(chuàng)建等差數(shù)列的一維數(shù)組,默認(rèn)是包括終值的。
1、算數(shù)運(yùn)算:
通過(guò) NumPy 可以自由地創(chuàng)建等差數(shù)組,同時(shí)也可以進(jìn)行加、減、乘、除、求 n 次方和取余數(shù)。
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
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)
print np.remainder(x1, x2)
運(yùn)行結(jié)果:
[ 2. 6. 10. 14. 18.]
[0. 0. 0. 0. 0.]
[ 1. 9. 25. 49. 81.]
[1. 1. 1. 1. 1.]
[1.00000000e+00 2.70000000e+01 3.12500000e+03 8.23543000e+05
3.87420489e+08]
[0. 0. 0. 0. 0.]
以x1,?x2?數(shù)組為例,求這兩個(gè)數(shù)組之間的加、減、乘、除、求?n?次方和取余數(shù)。在?n次方中,x2?數(shù)組中的元素實(shí)際上是次方的次數(shù),x1?數(shù)組的元素為基數(shù)。在取余函數(shù)里,你既可以用?np.remainder(x1,?x2),也可以用?np.mod(x1,?x2),結(jié)果是一樣的。
2、統(tǒng)計(jì)函數(shù):
在?NumPy?中如何使用統(tǒng)計(jì)函數(shù)。
計(jì)數(shù)組?/?矩陣中的最大值函數(shù)?amax(),最小值函數(shù)?amin()
import?numpy?as?np
a?=?np.array([[1,2,3],?[4,5,6],?[7,8,9]])
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)
運(yùn)行結(jié)果:
1
[1?2?3]
[1?4?7]
9
[7?8?9]
?[3?6?9]
amin()?用于計(jì)算數(shù)組中的元素沿指定軸的最小值。對(duì)于一個(gè)二維數(shù)組?a,amin(a)?指的是數(shù)組中全部元素的最小值,amin(a,0)?是延著?axis=0?軸的最小值,axis=0?軸是把元素看成了?[1,4,7],?[2,5,8],?[3,6,9]?三個(gè)元素,所以最小值為?[1,2,3],amin(a,1)?是延著?axis=1軸的最小值,axis=1?軸是把元素看成了?[1,2,3],?[4,5,6],?[7,8,9]?三個(gè)元素,所以最小值為[1,4,7]。同理?amax()?是計(jì)算數(shù)組中元素沿指定軸的最大值。
3、統(tǒng)計(jì)最大值與最小值之差?ptp()
代碼:
a?=?np.array([[1,2,3],?[4,5,6],?[7,8,9]])
print?np.ptp(a)
print?np.ptp(a,0)
print?np.ptp(a,1)
運(yùn)行結(jié)果:
8
[6?6?6]
[2?2?2]
對(duì)于相同的數(shù)組?a,np.ptp(a)?可以統(tǒng)計(jì)數(shù)組中最大值與最小值的差,即?9-1=8。同樣ptp(a,0)?統(tǒng)計(jì)的是沿著?axis=0?軸的最大值與最小值之差,即?7-1=6(當(dāng)然?8-2=6,9-3=6,第三行減去第一行的?ptp?差均為?6),ptp(a,1)?統(tǒng)計(jì)的是沿著?axis=1?軸的最大值與最小值之差,即?3-1=2(當(dāng)然?6-4=2,?9-7=2,即第三列與第一列的?ptp?差均為?2)。
4、統(tǒng)計(jì)數(shù)組的百分位數(shù)?percentile():
a?=?np.array([[1,2,3],?[4,5,6],?[7,8,9]])
print?np.percentile(a,?50)
print?np.percentile(a,?50,?axis=0)
print?np.percentile(a,?50,?axis=1)
運(yùn)行結(jié)果:
5.0
[4.?5.?6.]
[2.?5.?8.]
同樣,percentile()?代表著第?p?個(gè)百分位數(shù),這里?p?的取值范圍是?0-100,如果?p=0,那么就是求最小值,如果?p=50?就是求平均值,如果?p=100?就是求最大值。同樣你也可以求得在?axis=0?和?axis=1?兩個(gè)軸上的?p%?的百分位數(shù)。
5、統(tǒng)計(jì)數(shù)組中的中位數(shù)?median()、平均數(shù)?mean()
用?median()?和?mean()?求數(shù)組的中位數(shù)、平均值,同樣也可以求得在?axis=0?和?1兩個(gè)軸上的中位數(shù)、平均值。
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
# 求中位數(shù)
print np.median(a)
print np.median(a, axis=0)
print np.median(a, axis=1)
# 求平均數(shù)
print np.mean(a)
print np.mean(a, axis=0)
print np.mean(a, axis=1)
運(yùn)行結(jié)果:
5.0
[4. 5. 6.]
[2. 5. 8.]
5.0
[4. 5. 6.]
[2. 5. 8.]
6、NumPy 排序:
排序算法在 NumPy 中實(shí)現(xiàn)起來(lái)其實(shí)非常簡(jiǎn)單,一條語(yǔ)句就可以搞定。你可以使用 sort 函數(shù),sort(a, axis=-1, kind=‘quicksort’, order=None),默認(rèn)情況下使用的是快速排序;在 kind 里,可以指定 quicksort、mergesort、heapsort 分別表示快速排序、合并排序、堆排序。同樣 axis 默認(rèn)是 -1,即沿著數(shù)組的最后一個(gè)軸進(jìn)行排序,
也可以取不同的 axis 軸,或者 axis=None 代表采用扁平化的方式作為一個(gè)向量進(jìn)行排序。另外 order 字段,對(duì)于結(jié)構(gòu)化的數(shù)組可以指定按照某個(gè)字段進(jìn)行排序。
a = np.array([[4,3,2],[2,4,1]])
print np.sort(a)
print np.sort(a, axis=None)
print np.sort(a, axis=0)
print np.sort(a, axis=1)
運(yùn)行結(jié)果:
[[2 3 4]? [1 2 4]]
[1 2 2 3 4 4]
[[2 3 1]? [4 4 2]]??? ????這塊沒(méi)有懂
[[2 3 4]? [1 2 4]]