numpy-快速處理資料--矩陣運算
1. numpy-快速處理資料--ndarray物件--陣列的建立和訪問
2. numpy-快速處理資料--ndarray物件--多維陣列的訪問、結構體陣列訪問、記憶體對齊、numpy記憶體結構
3. numpy-快速處理資料--ufunc運算--廣播--ufunc方法
接下來介紹矩陣運算
numpy預設不使用矩陣運算,如果希望對陣列進行矩陣運算的話需要呼叫相應的函式
matrix 物件
numpy庫提供了matrix類,使用matrix類建立的是矩陣物件,它們的加減乘除運算預設採用矩陣方式計算,因此用法和matlab十分類似。但是由於numpy中同時存在ndarray和matrix物件,因此使用者很容易將兩者弄混。這有違python的「顯式優於隱式」的原則,因此並不推薦在較複雜的程式中使用matrix。下面是使用matrix的乙個例子:
1 >>> importnumpy 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的逆矩陣的乘積,結果是單位陣
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 物件,而把二維陣列看作是矩陣的話,就需要使用dot函式進行計算。對於二維陣列,它計算的是矩陣乘積,對於一維陣列,它計算的是其點積。當需要將一維陣列當作列向量或者行向量進行矩陣運算時,推薦先使用reshape或者shape函式將一維陣列轉換為二維陣列:
1 >>> a = np.array([1, 2, 3])2 >>> a.shape#
a是一維陣列
3 (3,)
4 >>> a.shape = (-1, 1)#
使用shape直接修改a的維數
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])
兩個三維陣列相乘
1 >>> a = np.arange(12).reshape(2,3,2)2 >>>a
3 array([[[ 0, 1],
4 [ 2, 3],
5 [ 4, 5]],
67 [[ 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]],
1415 [[18, 19, 20],
16 [21, 22, 23]]])
17 >>> c =np.dot(a,b)
18 >>>c
19 array([[[[ 15, 16, 17],
20 [ 21, 22, 23]],
2122 [[ 69, 74, 79],
23 [ 99, 104, 109]],
2425 [[123, 132, 141],
26 [177, 186, 195]]],
2728
29 [[[177, 190, 203],
30 [255, 268, 281]],
3132 [[231, 248, 265],
33 [333, 350, 367]],
3435 [[285, 306, 327],
36 [411, 432, 453]]]])
37 >>>c.shape
38 (2, 3, 2, 3)
dot乘積的結果c可以看做是陣列a, b的多個子矩陣的乘積:
1 >>> np.alltrue( c[0,:,0,:] ==np.dot(a[0],b[0]) )2true
3 >>> np.alltrue( c[1,:,0,:] == np.dot(a[1],b[0]) )
4true
5 >>> np.alltrue( c[0,:,1,:] == np.dot(a[0],b[1]) )
6true
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])
7true
8 >>> c[0,1,1,0] == np.inner(a[0,1],b[1,0])
9true
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]])
矩陣中更高階的一些運算可以在numpy的線性代數子庫linalg中找到。例如inv函式計算逆矩陣,solve函式可以求解多元一次方程組。下面是solve函式的乙個例子:
1 >>> a = np.random.rand(10,10)2 >>> b = np.random.rand(10)
3 >>> x = np.linalg.solve(a,b)
solve函式有兩個引數a和b。a是乙個n*n的二維陣列,而b是乙個長度為n的一維陣列,solve函式找到乙個長度為n的一維陣列x,使得a和x的矩陣乘積正好等於b,陣列x就是多元一次方程組的解。
numpy-快速處理資料--矩陣運算
numpy 矩陣運算
numpy 通過matrix基類支援向量運算,下面是生產向量的方法 執行結果 雖然array與matrix形式上類似,但不是一回事哦 我們可以通過array生成matrix物件,matrix物件提供矩陣計算功能。from numpy import numpy 多維資料元件,不支援向量運用 a1 ar...
Numpy 矩陣運算
c np.array 3 2,3 b np.array 3 2,3 print b.dot c print np.dot b,c print b c 只是對於位置的資料相乘 22 22 9 4 9 將陣列重新分配成參1 參2型別的陣列,但注意的是這不是轉置,將原來的陣列轉換成一維後直接排列成新的陣列...
NumPy 矩陣的運算
使用array函式通過傳入list或tuple來建立 numpy 的array物件。import numpy as np arr1 np.array 1 2,3 列表 arr2 np.array 1 2,3 元組 arr3 np.array 1,2,3 1,2,3 列表 列表 arr4 np.arr...