Python 2.7
IPython 4.1.2
關(guān)于Numpy
- Numpy是Python的一個(gè)矩陣類(lèi)型,提供大量矩陣處理函數(shù),內(nèi)部通過(guò)C實(shí)現(xiàn)。
- 包含兩種數(shù)據(jù)結(jié)構(gòu),數(shù)組array和矩陣matrix,其實(shí)就是array而已
構(gòu)建數(shù)組array
- 通過(guò)tuple構(gòu)建array
In[1]: from numpy import *
In[2]: yuanzu = (4,5,6)
In[3]: ll = array(yuanzu)
In[4]: ll
Out[4]: array([4, 5, 6])
- 通過(guò)list構(gòu)建array
In[5]: pylist = [0,1,2]
In[6]: jj = array(pylist)
In[7]: jj
Out[7]: array([0, 1, 2])
- 構(gòu)建多維array
In[95]: pylist1 = [1,2,3]
In[96]: pylist2 = [4,5,6]
In[100]: marray = array([pylist1,pylist2])
In[102]: marray
Out[102]:
array([[1, 2, 3],
[4, 5, 6]])
array基本操作
以marray的array來(lái)說(shuō)
In[102]: marray
Out[102]:
array([[1, 2, 3],
[4, 5, 6]])
- array索引
In[104]: marray[0][2]
Out[104]: 3
- array的對(duì)應(yīng)相乘
In[105]: marray*2
Out[105]:
array([[ 2, 4, 6],
[ 8, 10, 12]])
In[106]: marray*marray
Out[106]:
array([[ 1, 4, 9],
[16, 25, 36]])
構(gòu)建矩陣matrix
- 同樣可由tuple和list構(gòu)建matrix
#由list構(gòu)建
In[84]: mm = mat(pylist)
In[85]: mm
Out[85]: matrix([[0, 1, 2]])
#由tuple構(gòu)建
In[107]: oo = mat(yuanzu)
In[108]: oo
Out[108]: matrix([[4, 5, 6]])
- 由array構(gòu)建matrix
In[109]: pp = mat(marray)
In[110]: pp
Out[110]:
matrix([[1, 2, 3],
[4, 5, 6]])
matrix基本操作
對(duì)下面的pp矩陣來(lái)操作
In[110]: pp
Out[110]:
matrix([[1, 2, 3],
[4, 5, 6]])
- 查看維數(shù).shape
In[111]: pp.shape
Out[111]: (2L, 3L) #兩行三列的矩陣
- 取值,可以使用分片方法
In[116]: pp[1,2] #取第二行第三列元素
Out[116]: 6
In[115]: pp[1,:] #取第二行,所有列
Out[115]: matrix([[4, 5, 6]])
- 轉(zhuǎn)置.T
In[112]: pp.T
Out[112]:
matrix([[1, 4],
[2, 5],
[3, 6]])
- 矩陣乘法,注意矩陣乘法的規(guī)則,(m,n)*(n,p),對(duì)應(yīng)維數(shù)。
In[113]: pp*(pp.T)
Out[113]:
matrix([[14, 32],
[32, 77]])
- 對(duì)應(yīng)元素相乘 multiply(a,b)
In[114]: multiply(pp,pp)
Out[114]:
matrix([[ 1, 4, 9],
[16, 25, 36]])
- 排序sort,注意是原地排序,會(huì)改變?cè)紨?shù)據(jù),這個(gè)和pandas中的index操作不一樣
In[119]: qq = mat([2,1,3]) #構(gòu)建一個(gè)新的matrix
In[120]: qq
Out[120]: matrix([[2, 1, 3]])
In[121]: qq.sort() #進(jìn)行遞增排序,改變?cè)瓉?lái)數(shù)據(jù)
In[122]: qq
Out[122]: matrix([[1, 2, 3]])
- 獲得矩陣中每個(gè)元素的排序序號(hào)
In[126]: cc = mat([[3,1,4],[2,3,4]]) #重新構(gòu)建一個(gè)矩陣
In[127]: cc
Out[127]:
matrix([[3, 1, 4],
[2, 3, 4]])
In[128]: cc.argsort()
Out[128]:
matrix([[1, 0, 2],
[0, 1, 2]], dtype=int64)
#比如說(shuō)[3,1,4]這一行,元素先從小到大排序?yàn)閇1,3,4],對(duì)應(yīng)1的元素在原本的矩陣中索引應(yīng)該是1,對(duì)應(yīng)3的索引是0,4的索引是2,所以得出[1,0,2]
array VS matrix
官方建議多使用array
The main advantage of numpy arrays is that they are more general than 2-dimensional matrices. What happens when you want a 3-dimensional array? Then you have to use an ndarray, not a matrix object. Thus, learning to use matrix objects is more work -- you have to learn matrix object operations, and ndarray operations.
一句話,matrix應(yīng)該算是array的一個(gè)分支,只是array的二維表示而已,matrix的操作,array都可以完成,值得注意的是,想要完成矩陣相乘,而不是對(duì)應(yīng)相乘,array需要采用dot方法,舉個(gè)例子
#對(duì)應(yīng)相乘
In[129]: marray*marray
Out[129]:
array([[ 1, 4, 9],
[16, 25, 36]])
#矩陣相乘
In[130]: marray.dot(marray.T)
Out[130]:
array([[14, 32],
[32, 77]])
總結(jié)
If you are willing to give up the visual appeal of numpy matrix product notation, then I think numpy arrays are definitely the way to go.
--也就是,沒(méi)事多用用array
致謝
利用python進(jìn)行數(shù)據(jù)分析.Wes McKinney著
機(jī)器學(xué)習(xí)實(shí)戰(zhàn).Peter Harrington著