今天要來繼續介紹關於 NumPy 的應用。
資料型態、數學運算等等
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)
在建立好矩陣後,可以透過 astype()
將矩陣內元素的元素轉換型態。
x = np.array([1, 2, 3], dtype = 'uint8')
test = x.astype('float8')
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)的概念,用於當兩個矩陣的形狀不相等時,會自動補齊資料來讓運算可以繼續執行。
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
的那一行廣播到變成三行。
待續...