NumPy 快速處理資料 矩陣運算

2021-08-28 10:07:45 字數 3942 閱讀 3550

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 >>> 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的逆矩陣的乘積,結果是單位陣

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...