[NumPy 學習筆記] - No.3 NumPy數值運算及矩陣操作

numpy學習筆記

numpy是python中非常有用的一個庫,我們可以使用numpy創建大型的高維數組並進行運算。這裏記錄一下numpy一些常用的方法。如果想仔細研究numpy的強大功能還需要翻閱NumPy API文檔

數組運算

基本運算

在numpy中,最基本的運算是加減,即對應位置元素做加減法;注意我們提到的運算是shape相同的兩個變量之間的運算。

# 基本運算
x = np.array([[1,2], [3,4]], dtype=np.float64)
y = np.array([[1,2], [3,4]], dtype=np.float64)
print ("x + y:\n", np.add(x, y)) # or x + y
print ("x - y:\n", np.subtract(x, y)) # or x - y

x + y:
[[ 2. 4.]
[ 6. 8.]]
x - y:
[[ 0. 0.]
[ 0. 0.]

除此之外,還可以對矩陣的行元素求和,列元素求和,全部元素求和:

x = np.array([[1,2],[3,4]])
print (x)
print ("sum all: ", np.sum(x)) # adds all elements
print ("sum by col: ", np.sum(x, axis=0)) # add numbers in each column
print ("sum by row: ", np.sum(x, axis=1)) # add numbers in each row

[[1 2]
[3 4]]
sum all: 10
sum by col: [4 6]
sum by row: [3 7]

乘法和點乘

乘法很簡單,就是矩陣對應位置求乘積; 點乘則是數學中的一種矩陣運算

x = np.array([[1,2], [3,4]], dtype=np.float64)
y = np.array([[1,2], [3,4]], dtype=np.float64)
print ("x * y:\n", np.multiply(x, y)) # or x * y  

# Dot product
a = np.array([[1,2,3], [4,5,6]], dtype=np.float64) # we can specify dtype
b = np.array([[7,8], [9,10], [11, 12]], dtype=np.float64)
print ("dot product:\n",a.dot(b))

x * y:
[[ 1. 4.]
[ 9. 16.]]
dot product:
[[ 58. 64.]
[ 139. 154.]]

矩陣轉置
# Transposing
print ("x:\n", x)
#x:
# [[1 2]
# [3 4]]

print ("x.T:\n", x.T)
#x.T:
# [[1 3]
# [2 4]]

高級操作

Tile

np.tile(A,B)代表將A重複B次;B如果是int型表示在列方向上重複B次;B如果是二元組表示分別在行和列上重複。

x = np.array([[1,2], [3,4]])
print("列方向重複2:\n",np.tile(x,2))
#列方向重複2:
# [[1 2 1 2]
# [3 4 3 4]]

print("行列均重複2:\n",np.tile(x,(2,2)))
#行列均重複2:
# [[1 2 1 2]
# [3 4 3 4]
# [1 2 1 2]
# [3 4 3 4]]
Broadcasting

之前,我們說過在numpy的運算中,參與運算的兩個變量需要具有相同的shape。如果兩個變量尺寸不相同可以運算麼?

進行x + y操作, 如果x,y的尺寸不相同,在滿足一定的條件下,觸發廣播機制,是可以進行運算的

我們對 x,y的shape,從後向前逐位比對,如果x,y的shape每一位數字滿足下列條件中的一個:

  • 相同
  • 有一個數字是1

比對完成後,那麼x,y是可以進行廣播的。

例如:

x.shape是(3,3,3) y.shape是(3,3,3) x,y的shape 每一位數字滿足上述條件 可以進行計算

x.shape是(3,5) y.shape 是(3,1) x,y的shape 每一位數字滿足上述條件 可以進行廣播

x.shape是(3,5) y.shape 是(5,3) x,y的shape 每一位數字不滿足上述條件 不可以進行廣播

我們來看一個例子

a = np.array([[ 0, 0, 0],
          [10,10,10],
          [20,20,20],
          [30,30,30]])
b = np.array([1,2,3])
print(a + b)

結果如下:

[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]

運行a+b,由於a,b的尺寸不一樣,且a.shape == (4,3), b.shape == (1,3) , 觸發了廣播機制

在這裏插入圖片描述

如上圖所示,由於a,b的列相同,行數不相同,因此b在行方向重複4次,然後和a相加。如果是4X3 的矩陣和4x1 的矩陣相加,那麼就是將3x1 矩陣在列方向重複三次,進行相加。

Reshape

在numpy中,使用reshape對數組進行尺寸轉換,但要求reshape前後兩個矩陣的元素相同,及3x4的矩陣無法被reshape 成 1x8的矩陣

以3x4矩陣爲例:

x = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
y1 = x.reshape(4,3)
print("y1:\n",y1)

z1 = x.reshape(2,2,3)
print("z1:\n",z1)

# reshape的參數中,允許一個參數爲未知,即-1,另外一個維度會被自動計算出來
z2 = x.reshape(2,-1)
print("z2:\n",z2)

z3 = x.reshape(-1)   #直接將數組拉成一維數組
print("z3:\n",z3)

y1:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
z1:
[[[ 1 2 3]
[ 4 5 6]]

[[ 7 8 9]
[10 11 12]]]
z2:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
z3:
[ 1 2 3 4 5 6 7 8 9 10 11 12]

Removing dimensions

使用np.squeeze (x) 來刪除x中單維度,例如:

x = np.array([[[1,2,1]],[[2,2,3]]])
print ("x.shape: ", x.shape)
y = np.squeeze(x) # squeeze dim 1
print ("y.shape: ", y.shape) 
print ("y: \n", y)

x.shape: (2, 1, 3)
y.shape: (2, 3)
y:
[[1 2 1]
[2 2 3]]

如果變量x中有多個單維度,可以通過制定axis來刪除某個維度:

x = np.arange(12).reshape(1,3,1,4)
print("x:\n",x)
print("x.shape:\n",x.shape)

y1 = np.squeeze(x,0)
y2 = np.squeeze(x,2)
print("y1.shape:\n",y1.shape)
print("y2.shape:\n",y2.shape)

x:
[[[[ 0 1 2 3]]

[[ 4 5 6 7]]

[[ 8 9 10 11]]]]
x.shape:
(1, 3, 1, 4)
y1.shape:
(3, 1, 4)
y2.shape:
(1, 3, 4)

Adding dimensions

除了刪除維度之外,還可以添加一個單維度。

# Adding dimensions
x = np.array([[1,2,1],[2,2,3]])
print ("x.shape: ", x.shape)
y = np.expand_dims(x, 1) # expand dim 1
print ("y.shape: ", y.shape) 
print ("y: \n", y)

x.shape: (2, 3)
y.shape: (2, 1, 3)
y:
[[[1 2 1]]

[[2 2 3]]]

資料參考:practicalAI

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章