今天是4.28號。
天氣又開始變陰,雨持續了一整個月。
之前學習了用python寫爬蟲和python與mongodb數據庫、文件之間的簡單操作。想想自己還是想用python去做數據分析,或者能夠在證券量化工作中用到相應的知識,所以接下來會主要學習數據分析相關的庫numpy,pandas,matplotlib等,至于機器學習的庫scikit-learn則等掌握了前三個庫的使用后再根據需要去學習。
import numpy as np
可以認為numpy就是一個多維的列表(list):
例如
a=[[1,2,3],
[3,4,5],]
a.shape能夠得到a是nxn維數組;
a.dtype能夠得到數組中的元素類型是什么;同時注意narray中所有元素的類型必須是一致的。
取數組a中特定位置的值也是用索引,一維直接用a[x],二維用a[x,y]即第x行第y列的數據。
(1) arange函數在numpy中用于創建等差數組,使用頻率非常高。arange非常類似range函數,在沒有學習numpy時在for循環中,幾乎都用到了range,二者的區別僅僅在于是arange返回的是一個arr數組,而range返回的是list。
range()函數的用法:
range(1,5) #代表從1到5(不包含5)
[1, 2, 3, 4]
range(1,5,2) #代表從1到5,間隔2(不包含5)
[1, 3]
range(5) #代表從0到5(不包含5)
[0, 1, 2, 3, 4]
(2) 花式索引,即利用整數數組進行索引。
例如
arr=[[1,1,2,3],
[1,4,5,6],
[3,2,5,0],
[2,3,1,9]]
那么arr[[1,3]]得到的結果為arr([[1,4,5,6],[2,3,1,9]])
(3) 進行矩陣計算時常用到轉置(T)和內積:
arr.T,可以直接表示轉置
np.dot()函數可以計算內積,如np.dot(a,a.T)
(4) arr是一個數組,有一些函數可以快速對數組中所有的元素進行相應的計算操作:
用法例子為:np.abs(arr),np.sqrt(arr)
對兩個數組的操作為:add(x,y),multiply(x,y)等,執行方法是均是對應位置元素進行計算。
(5)條件方法 np.where(cond,x,y)三元表達式的使用,其中cond表示條件;x、y可以是單獨的數字,可以是數組。在數據分析中,它常用于根據一個數組產生新的數組。
例如假設現在有兩個數值數組和一個布爾型值數組:
xarr=np.array([2,2,3,5,6])
yarr=np.array([5,6,9,0,1])
con=np.array([False,True,True,True,False])
現在想根據con的值選取xarr、yarr中的值,當con中值為True時選xarr的值,否則選y的值。
用一般的方法為:
result=[(x if c else y) for x,y,c in zip(xarr,yarr,con)]
使用np.where()則能極大提高計算效率,用法為:
result=np.where(con,xarr,yarr)
**(6) 數學和統計方法 **
可通過sum,mean,std等方法對對整個數組或某個軸上的數據進行統計計算,通常叫做約簡(reduction)。
對于axis不懂的可以直接這樣理解,axis=0或沒有即默認為零,就豎著看;aixs=1就橫著看。
若x為一個數組使用方法為:
x.sum(), x.mean()
x.sum(axis=0或1),其中axis=0 表示按行將每一列的向量相加,axis=1表示按列將每一行的向量相加。
sum也可以用來對布爾型數組中的True值計數:
例如:arr=randn(100)
(arr>0).sum()
(7) sort()排序
若x為一個數組,x.sort()默認將數組x中的元素從小到大排序。若x是多維數組,x.sort()會默認按從小到大對每一列進行排序;x.sort(1)則會從小到大對每一行進行排序。
(8) 數組的集合運算
np.unique()與python中set()的功能類似。
例若a=np.array([1,2,3,2,3,4,6])
則np.unique(a)結果為array([1,2,3,4,6]),np,unique()在去除重復元素的同時將元素從小到大進行了排序。
其他集合運算如下,注意集合運算的結果均是數組
(9) 線性代數的相關計算
這里暫時不作介紹,后面有需要用到時具體學習并補充進來
(10) 隨機數生成
numpy.random模塊對python中內置的random進行了補充。使用隨機數生成函數時一般要加size=()的參數。
例如使用的方法為:
a). numpy.random.normal(size=(4,4))可以得到4x4維服從正太分布的數組,
其中size是normal()函數的一個參數,random的其他函數也有該參數,若該參數缺失,則默認只生成一個值.
b). randint(low,high,size=xx)
表示從low到high范圍內隨機生成size個整數,且high值取不到。
注意:當high缺失或聲明high=None時,將唯一的一個數作為上限。
例如:a=np.random.randint(3,size=10)和a=np.random.randint(3,high=None,size=(2,3))
二者表達的意思是一樣的。
c). random.randn(n,n)可以生成nxn維的服從正太分布的隨機數據數組。
部分numpy.random函數如下:
最后再說一下reshape()函數可以把一維數組轉化為自己想要的多維數組,如下:
np.random.randint(8,size=9).reshape(3,3)