iT邦幫忙

2021 iThome 鐵人賽

DAY 25
1
Software Development

宇宙 69 大魔王的 python 世界系列 第 25

【Day 25】NumPy (2)

前言

今天要來繼續介紹關於 NumPy 的應用。

資料型態、數學運算等等

NumPy

Datatype

Type 說明
bool 布林值
int8 8 位元有號整數
int16 16 位元有號整數
int32 32 位元有號整數
int64 64 位元有號整數
uint8 8 位元無號整數
uint16 16 位元無號整數
uint32 32 位元無號整數
uint64 64 位元無號整數
float16 16 位元浮點數
float32 32 位元浮點數
float64 64 位元浮點數
complex64 64 位元複數
complex128 128 位元複數

在新建一個 ndarray 後,可以指定這個矩陣裡面要存的資料的資料型別

import numpy as np

# 用字串指定 Datatype
x = np.array([1, 2, 3], dtype = 'uint8')

# 通過 np.datatype 指定
x = np.array([4, 5, 6], dtype = np.int16)

Datatype 轉換

在建立好矩陣後,可以透過 astype() 將矩陣內元素的元素轉換型態。

x = np.array([1, 2, 3], dtype = 'uint8')
test = x.astype('float8')

NumPy 運算

  • 轉置 Transpose:透過 array.T 這個函式來轉置矩陣
array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(array1)
#[[1 2 3]
# [4 5 6]
# [7 8 9]]
array1_T = array1.T
print(array1_T)
#[[1 4 7]
# [2 5 8]
# [3 6 9]]
  • 加減乘除運算
array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
array2 = np.array([[10, 11, 12], [13, 14, 15], [16, 17, 18]])

print(array1 + array2)
# [[11 13 15]
#  [17 19 21]
#  [23 25 27]]
print(array1 - array2)
# [[-9 -9 -9]
#  [-9 -9 -9]
#  [-9 -9 -9]]
print(array1 * array2)
# [[ 10  22  36]
#  [ 52  70  90]
#  [112 136 162]]
print(array1 / array2)
# [[0.1        0.18181818 0.25      ]
#  [0.30769231 0.35714286 0.4       ]
#  [0.4375     0.47058824 0.5       ]]

這邊的 * 運算不是矩陣的內雞 dot 運算,是把同樣位置的元素乘起來而已。

若要計算矩陣的內積,要通過 np.dot() 來運算

print(np.dot(array1, array2))
#[[ 84  90  96]
# [201 216 231]
# [318 342 366]]

NumPy 廣播(broadcasting)

矩陣運算的兩個矩陣應該形狀要相同,才能運算。在 NumPy 中引入了廣播(broadcasting)的概念,用於當兩個矩陣的形狀不相等時,會自動補齊資料來讓運算可以繼續執行。

array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
array2 = array1 + 1
print(array2)
# [[ 2  3  4]
#  [ 5  6  7]
#  [ 8  9 10]]

這邊矩陣 array1 跟 1 相加,可以把 1 當作是一個 1x1 的矩陣,他被廣播成了 3x3,其他空格都用 1 來填充。

實際上他做的事情是

array1 + np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])

如果相加的兩個矩陣中,有其他一個維度一樣

array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
array3 = np.array([1, 2, 3])
print(array1 + array3)
# [[ 2  4  6]
#  [ 5  7  9]
#  [ 8 10 12]]

矩陣 array1 是一個 3x3 的矩陣,矩陣 array3 是一個 1x3 的矩陣,當他們有滿足某一個維度一樣,NumPy 會把 array3 的那一行廣播到變成三行。

待續...


上一篇
【Day 24】NumPy (1)
下一篇
【Day 26】NumPy (3):Slicing, Copy, View, shape, Concatenate
系列文
宇宙 69 大魔王的 python 世界30

尚未有邦友留言

立即登入留言