【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 的那一行广播到变成三行。

待续...


<<:  Day26:26 - 优化 - 後端 & 前端 - 忘记密码

>>:  Day 28 shared_preferences本机存放区

D18 - 如何用 Apps Script 自动化地创造与客制 Google Docs?(五)Element 的更新

今天的目标 要怎麽简单快速地做出客制化地文件?今天,我们会教用 GAS 搭配 Goolge Doc。...

Day19 Gin with Swagger

Background 在前後端分离的专案维护一份完整且及时更新的api文件会极大的提高我们的工作效率...

第八天:用 Docker 运行 Gradle

昨天介绍的全手动安装是对系统掌控的一种极端,而今天要介绍的,是对系统洁癖的另一种极端。假如你受够了要...

【杂谈】 今天就来点闲聊吧③ - 铁人赛观察之有意思的系列

奇怪的知识增加了!原来程序还可以这样用?! 这次在Software Development的热门文章...

[Day 9] 练练CSS,「Amos - 金鱼都能懂的网页切版 」实作练习

前言 相信很多刚开始接触CSS或想对切版有所认识,都知道Amos老师吧!! 非常非常感谢老师的系列教...