NumPy中ndarray和matrix的四則運算

2021-08-13 13:54:18 字數 3864 閱讀 9578

numpy中最重要的類是ndarray,顧名思義,即多維陣列。

import numpy as np
行向量:

a = np.array([1,2,3]) # a.shape=(3l,)
列向量:

b = np.array([[1],[2],[3]]) # b.shape=(3l, 1l)
二維矩陣:

m = np.array([[1,2,3],[4,5,6],[7,8,9]] # m.shape=(3l, 3l)
四則運算(+-*/),注意多維陣列ndarray中「加減乘除」跟數學中的矩陣運算沒有半毛錢關係。

運算都是element-wise的,當兩個陣列維度不一樣時,維度小的會拓展複製(broadcast)跟維度大的陣列一樣。

例如上面的行向量a和列向量b分別與m進行四則運算時,會拓展為: a→

⎡⎣⎢1

1122

2333

⎤⎦⎥,

b→⎡⎣

⎢123

1231

23⎤⎦

⎥ 例子:a + m:[1

23]+

⎡⎣⎢1

4725

8369

⎤⎦⎥=

⎡⎣⎢1

+14+

17+1

2+25

+28+

23+3

6+39

+3⎤⎦

⎥=⎡⎣

⎢258

48106

912⎤⎦

b + m:⎡⎣

⎢123

⎤⎦⎥+

⎡⎣⎢1

4725

8369

⎤⎦⎥=

⎡⎣⎢1

+14+

27+3

2+15

+28+

33+1

6+29

+3⎤⎦

⎥=⎡⎣

⎢2610

37114

812⎤⎦

b - m:⎡⎣

⎢123

⎤⎦⎥−

⎡⎣⎢1

4725

8369

⎤⎦⎥=

⎡⎣⎢1

−12−

43−7

1−22

−53−

81−3

2−63

−9⎤⎦

⎥=⎡⎣

⎢0−2

−4−1

−3−5

−2−4

−6⎤⎦

b * m:⎡⎣

⎢123

⎤⎦⎥×

⎡⎣⎢1

4725

8369

⎤⎦⎥=

⎡⎣⎢1

∗14∗

27∗3

2∗15

∗28∗

33∗1

6∗29

∗3⎤⎦

⎥=⎡⎣

⎢1821

210243

1227⎤⎦

b / m:⎡⎣

⎢123

⎤⎦⎥/

⎡⎣⎢1

4725

8369

⎤⎦⎥=

⎡⎣⎢1

/12/

43/7

1/22

/53/

81/3

2/63

/9⎤⎦

⎥=⎡⎣

⎢100

0000

00⎤⎦

⎥ 當a是4維的行向量與m運算呢?

例如a = [1, 2, 3, 4]a + m等於多少呢? 此時會報錯:

valueerror: operands could not be broadcast together with shapes (4,) (3,3)

那numpy中難道就沒有像數學中的矩陣乘法運算了嗎?答案是有的,這裡就要用到matrix類,其有乙個別名mat,用法是一樣的。

行向量:

p = np.mat([1,2,3]) # p.shape=(1l, 3l)
列向量:

q = np.mat([[1],[2],[3]]) # q.shape=(3l, 1l)
二維矩陣:

n = np.mat([[1,2,3],[4,5,6],[7,8,9]]) # n.shape=(3l, 3l)
它們之間的加減除跟ndarray是一樣的,但就按照數學矩陣乘法:

p * n:[1

23]×

⎡⎣⎢1

4725

8369

⎤⎦⎥=

[303642]

q * n則會報錯:

valueerror: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0)

對於matrix,資料均以二維的形式儲存,例如:

p

matrix([[1, 2, 3]])
q

matrix([[1],

[2],

[3]])

p * q(結果是乙個標量):

matrix([[14]])
ndarray陣列可以實現矩陣的乘法,即:

np.dot(a, b) # array([14])

np.dot(a, m) # array([30, 36, 42])

np.dot(a, a) # 14;特別地,兩個行向量得到數學中的內積

np.dot(b, b) # 報錯!

matrix可以實現element-wise的點乘,即:

np.multiply(p, n)

out:

matrix([[ 1, 4, 9],

[ 4, 10, 18],

[ 7, 16, 27]])

注意區分數學中的點乘和計算機中的點乘:數學中的點乘也叫點積、內積,是兩個向量中的元素分別相乘再相加得到乙個標量;而計算機中的點乘就是指element-wise的乘法。

np.asarray(matrix)

np.asmatrix(ndarray)

注意如果ndarray是3維及以上的陣列,則轉不了matrix,因為matrix總是二維的。

如:

t = np.arange(12).reshape(2, 2, 3)

out:

array([[[ 0, 1, 2],

[ 3, 4, 5]],

[[ 6, 7, 8],

[ 9, 10, 11]]])

np.asmatrix(t)

# valueerror: shape too large to be a matrix.

科學計算庫Numpy 陣列(ndarray)

學過其他強型別語言的朋友都知道陣列是一種資料型別,它裡面的元素必須是同一種型別,類似python的列表,但是這種列表只能是同種元素。用法numpy.array list tuple import numpy as np 重新命名numpy為np arr np.array 1,2,3,4,5,6 建立...

numpy 基於數值範圍建立ndarray()

基於數值範圍建立函式建立ndarray arange start 0,stop step 1,dtype none np.arange 3 array 0,1,2 np.arange 3.0 array 0.1.2.np.arange 3,7 array 3,4,5,6 np.arange 3,7,...

Numpy學習一 ndarray陣列物件

numpy是python的乙個高效能科學計算和資料分析基礎庫,提供了功能強大的多維陣列物件ndarray。jupyter notebook快速執行 的快捷鍵 滑鼠點選選中要指定的 框,shift enter組合鍵直接執行 框中的全部 alt enter組合鍵執行完 框中的 在 框的下面再新增乙個空 ...