本文摘自《用Python做科學(xué)計(jì)算》,版權(quán)歸原作者所有。 1. NumPy-快速處理數(shù)據(jù)--ndarray對(duì)象--數(shù)組的創(chuàng)建和存取 2. NumPy-快速處理數(shù)據(jù)--ndarray對(duì)象--多維數(shù)組的存取、結(jié)構(gòu)體數(shù)組存取、內(nèi)存對(duì)齊、Numpy內(nèi)存結(jié)構(gòu) 3. NumPy-快速處理數(shù)據(jù)--ufunc運(yùn)算--廣播--ufunc方法 接下來(lái)介紹矩陣運(yùn)算 Numpy默認(rèn)不使用矩陣運(yùn)算,如果希望對(duì)數(shù)組進(jìn)行矩陣運(yùn)算的話需要調(diào)用相應(yīng)的函數(shù) matrix 對(duì)象 numpy庫(kù)提供了matrix類,使用matrix類創(chuàng)建的是矩陣對(duì)象,它們的加減乘除運(yùn)算缺省采用矩陣方式計(jì)算,因此用法和matlab十分類似。但是由于NumPy中同時(shí)存在ndarray和matrix對(duì)象,因此用戶很容易將兩者弄混。這有違Python的“顯式優(yōu)于隱式”的原則,因此并不推薦在較復(fù)雜的程序中使用matrix。下面是使用matrix的一個(gè)例子: 1 >>> import numpy as np 2 >>> a = np.matrix([[1,2,3],[5,5,6],[7,9,9]]) 3 >>> a**-1 # a 的逆矩陣 4 matrix([[-0.6 , 0.6 , -0.2 ], 5 [-0.2 , -0.8 , 0.6 ], 6 [ 0.66666667, 0.33333333, -0.33333333]]) 7 >>> a * a**-1 # a與a的逆矩陣的乘積,結(jié)果是單位陣 8 matrix([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00], 9 [ 4.44089210e-16, 1.00000000e+00, 4.44089210e-16], 10 [ 0.00000000e+00, -4.44089210e-16, 1.00000000e+00]]) 如果不使用matrix 對(duì)象,而把二維數(shù)組看作是矩陣的話,就需要使用dot函數(shù)進(jìn)行計(jì)算。對(duì)于二維數(shù)組,它計(jì)算的是矩陣乘積,對(duì)于一維數(shù)組,它計(jì)算的是其點(diǎn)積。當(dāng)需要將一維數(shù)組當(dāng)作列矢量或者行矢量進(jìn)行矩陣運(yùn)算時(shí),推薦先使用reshape或者shape函數(shù)將一維數(shù)組轉(zhuǎn)換為二維數(shù)組: 1 >>> a = np.array([1, 2, 3]) 2 >>> a.shape#a是一維數(shù)組 3 (3,) 4 >>> a.shape = (-1, 1)#使用shape直接修改a的維數(shù) 5 >>> a 6 array([[1], 7 [2], 8 [3]]) 9 >>> a.reshape(1, -1) #使用reshape也可以,但是他的返回值改變a的shape,而a本身不變 10 array([[1, 2, 3]]) 11 >>> a 12 array([[1], 13 [2], 14 [3]])
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m]) 兩個(gè)三維數(shù)組相乘 1 >>> a = np.arange(12).reshape(2,3,2) 2 >>> a 3 array([[[ 0, 1], 4 [ 2, 3], 5 [ 4, 5]], 6 7 [[ 6, 7], 8 [ 8, 9], 9 [10, 11]]]) 10 >>> b = np.arange(12,24).reshape(2,2,3) 11 >>> b 12 array([[[12, 13, 14], 13 [15, 16, 17]], 14 15 [[18, 19, 20], 16 [21, 22, 23]]]) 17 >>> c = np.dot(a,b) 18 >>> c 19 array([[[[ 15, 16, 17], 20 [ 21, 22, 23]], 21 22 [[ 69, 74, 79], 23 [ 99, 104, 109]], 24 25 [[123, 132, 141], 26 [177, 186, 195]]], 27 28 29 [[[177, 190, 203], 30 [255, 268, 281]], 31 32 [[231, 248, 265], 33 [333, 350, 367]], 34 35 [[285, 306, 327], 36 [411, 432, 453]]]]) 37 >>> c.shape 38 (2, 3, 2, 3) dot乘積的結(jié)果c可以看做是數(shù)組a, b的多個(gè)子矩陣的乘積: 1 >>> np.alltrue( c[0,:,0,:] == np.dot(a[0],b[0]) ) 2 True 3 >>> np.alltrue( c[1,:,0,:] == np.dot(a[1],b[0]) ) 4 True 5 >>> np.alltrue( c[0,:,1,:] == np.dot(a[0],b[1]) ) 6 True 7 >>> np.alltrue( c[1,:,1,:] == np.dot(a[1],b[1]) ) 8 True
1 inner(a, b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:])
1 >>> a = np.arange(12).reshape(2,3,2) 2 >>> b = np.arange(12,24).reshape(2,3,2) 3 >>> c = np.inner(a,b) 4 >>> c.shape 5 (2, 3, 2, 3) 6 >>> c[0,0,0,0] == np.inner(a[0,0],b[0,0]) 7 True 8 >>> c[0,1,1,0] == np.inner(a[0,1],b[1,0]) 9 True 10 >>> c[1,2,1,2] == np.inner(a[1,2],b[1,2]) 11 True
1 >>> np.outer([1,2,3],[4,5,6,7]) 2 array([[ 4, 5, 6, 7], 3 [ 8, 10, 12, 14], 4 [12, 15, 18, 21]]) 矩陣中更高級(jí)的一些運(yùn)算可以在NumPy的線性代數(shù)子庫(kù)linalg中找到。例如inv函數(shù)計(jì)算逆矩陣,solve函數(shù)可以求解多元一次方程組。下面是solve函數(shù)的一個(gè)例子: 1 >>> a = np.random.rand(10,10) 2 >>> b = np.random.rand(10) 3 >>> x = np.linalg.solve(a,b) solve函數(shù)有兩個(gè)參數(shù)a和b。a是一個(gè)N*N的二維數(shù)組,而b是一個(gè)長(zhǎng)度為N的一維數(shù)組,solve函數(shù)找到一個(gè)長(zhǎng)度為N的一維數(shù)組x,使得a和x的矩陣乘積正好等于b,數(shù)組x就是多元一次方程組的解。 |
|