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陣列可以實現矩陣的乘法,即:
matrix可以實現element-wise的點乘,即:np.dot(a, b) # array([14])
np.dot(a, m) # array([30, 36, 42])
np.dot(a, a) # 14;特別地,兩個行向量得到數學中的內積
np.dot(b, b) # 報錯!
注意區分數學中的點乘和計算機中的點乘:數學中的點乘也叫點積、內積,是兩個向量中的元素分別相乘再相加得到乙個標量;而計算機中的點乘就是指element-wise的乘法。np.multiply(p, n)
out:
matrix([[ 1, 4, 9],
[ 4, 10, 18],
[ 7, 16, 27]])
注意如果ndarray是3維及以上的陣列,則轉不了matrix,因為matrix總是二維的。np.asarray(matrix)
np.asmatrix(ndarray)
如:
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組合鍵執行完 框中的 在 框的下面再新增乙個空 ...