逐元素算术运算
逐元素对数组进行加、减、乘、除运算,并理解 NumPy 如何避免显式编写 Python 循环。
逐元素算术运算 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。
Python 循环的问题
使用纯 Python 将列表相加需要运行缓慢的循环,而 NumPy 会改用快速的 C 来完成,通常快 10 到 100 倍。这种技巧称为向量化。⚡
# Python list approach -- slow
a = [1, 2, 3, 4]
b = [10, 20, 30, 40]
result = [x + y for x, y in zip(a, b)]
print(result) # [11, 22, 33, 44]
# NumPy approach -- fast
import numpy as np
na, nb = np.array(a), np.array(b)
print(na + nb) # [11 22 33 44]加法和减法
对于形状相同的数组,+ 和 - 运算符会逐元素运行,在一次快速遍历中将对应位置配对计算。
import numpy as np
a = np.array([10, 20, 30])
b = np.array([1, 2, 3])
print(a + b) # [11 22 33]
print(a - b) # [ 9 18 27]乘法和除法
使用 * 和 / 进行逐元素的乘法和除法——请注意,* 不是矩阵乘法。除法始终返回浮点数,即使输入的是整数。
import numpy as np
a = np.array([10, 20, 30])
b = np.array([2, 4, 5])
print(a * b) # [ 20 80 150]
print(a / b) # [5. 5. 6.]
print(a // b) # [5 5 6]
print(a % b) # [0 0 0]标量运算(广播预览)
将一个数字加到数组上时,NumPy 会将它应用到每个元素。这就是最简单形式的广播,非常适合平移或缩放数据。
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a + 10) # [11 12 13 14 15]
print(a * 2) # [ 2 4 6 8 10]
print(a ** 2) # [ 1 4 9 16 25]
print(a / 10) # [0.1 0.2 0.3 0.4 0.5]幂运算和平方根
使用 ** 将每个元素提升到指定次幂。计算平方根时,请使用 np.sqrt 这个通用函数;它由 C 实现,比在 Python 中循环更快。
import numpy as np
a = np.array([1.0, 4.0, 9.0, 16.0])
print(a ** 0.5) # [1. 2. 3. 4.]
print(np.sqrt(a)) # [1. 2. 3. 4.]
print(a ** 2) # [ 1. 16. 81. 256.]比较运算符返回布尔数组
使用 >、== 或 < 将数组进行比较,会得到一个由 True/False 值组成的布尔数组,这是筛选数据的基础。
import numpy as np
a = np.array([3, 7, 2, 9, 1])
print(a > 4) # [False True False True False]
print(a == 2) # [False False True False False]
print(a >= 3) # [ True True False True False]对布尔数组使用逻辑运算符
要组合布尔数组,请使用 &、| 和 ~ 符号,而不是 and、or、not 这些单词。将每个条件放在括号中,以避免运算优先级带来的意外结果。
import numpy as np
a = np.array([3, 7, 2, 9, 1])
mask = (a > 2) & (a < 8)
print(mask) # [ True True False False False]
print(a[mask]) # [3 7]使用 += 进行原地运算
+= 等运算符会直接修改数组,通过跳过新副本来节省内存。但请确保 dtype 兼容——不能用这种方式将 0.5 加到整数数组上。
import numpy as np
a = np.array([1.0, 2.0, 3.0])
a += 10.0
print(a) # [11. 12. 13.]
a *= 2.0
print(a) # [22. 24. 26.]二维数组运算
逐元素运算在二维数组上的工作方式相同:将两个形状匹配的矩阵相加时,每个单元格都会与对应位置的单元格相加。不需要嵌套循环。
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A + B)
# [[ 6 8]
# [10 12]]
print(A * B) # element-wise, NOT matrix multiply
# [[ 5 12]
# [21 32]]混合运算中的 dtype 提升
混合两种 dtype 时,NumPy 会将它们都提升为更安全的类型,从而避免信息丢失——整数加浮点数会得到浮点数。请注意,这可能会悄悄增加内存占用。
import numpy as np
a = np.array([1, 2, 3], dtype=np.int32)
b = np.array([0.5, 1.5, 2.5], dtype=np.float64)
c = a + b
print(c) # [1.5 3.5 5.5]
print(c.dtype) # float64绝对值和符号
使用 np.abs 计算绝对值,使用 np.sign 为每个元素得到 -1、0 或 +1。二者都是快速的通用函数,常用于损失函数和归一化步骤。
import numpy as np
a = np.array([-3, 0, 4, -7, 2])
print(np.abs(a)) # [3 0 4 7 2]
print(np.sign(a)) # [-1 0 1 -1 1]快速检查
检验您对本课 NumPy 逐元素运算内容的理解。
课程回顾
您已经掌握了!NumPy 无需循环即可进行逐元素运算,标量会广播到整个数组,比较运算会得到布尔数组。下一步学习切片和索引。
常见问题解答
「逐元素算术运算」课时是免费的吗?
是的 — 「逐元素算术运算」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。
「逐元素算术运算」这节课中我会学到什么?
逐元素对数组进行加、减、乘、除运算,并理解 NumPy 如何避免显式编写 Python 循环。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Pandas & NumPy Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「逐元素算术运算」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?
能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 创建 NumPy 数组
- 数组属性与检查
- 逐元素算术运算
- 数组切片与索引