数组运算与广播
执行向量化算术运算,并了解广播规则。
数组运算与广播 是 CoddyKit 上的免费 Python Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
向量化算术运算
NumPy 会对整个数组逐元素执行算术运算,无需使用 Python 循环;这些运算在经过优化的 C 代码中执行。
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # [5 7 9]
print(a * b) # [4 10 18]
print(a ** 2) # [1 4 9]通用函数(ufunc)
NumPy 的 ufunc 会逐元素应用 C 层函数:np.sqrt、np.exp、np.log、np.sin 等。
import numpy as np
x = np.linspace(0, np.pi, 5)
print(np.sin(x)) # [0. 0.707 1. 0.707 0.]
print(np.exp([1.0, 2.0, 3.0])) # [2.718 7.389 20.086]归约运算
使用 np.sum、np.mean、np.max、np.min 和 np.std,将数组归约为标量(或更低维的数组)。
import numpy as np
m = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(m)) # 21
print(np.sum(m, axis=0)) # [5 7 9] — sum each column
print(np.sum(m, axis=1)) # [6 15] — sum each row广播规则
广播会扩展较小的数组,使其与较大的数组匹配,而无需复制数据。规则是:从右侧对齐维度,并扩展大小为 1 的维度。
import numpy as np
a = np.array([[1], [2], [3]]) # shape (3,1)
b = np.array([10, 20, 30]) # shape (3,)
print(a + b)
# [[11 21 31]
# [12 22 32]
# [13 23 33]]标量运算的广播
标量会广播到数组的所有元素。
import numpy as np
arr = np.arange(6).reshape(2, 3)
print(arr + 10)
# [[10 11 12]
# [13 14 15]]
print(arr * 0.5)
# [[0. 0.5 1. ]
# [1.5 2. 2.5]]比较和布尔运算
比较运算会生成布尔数组。请使用 &、| 和 ~ 进行组合,而不要使用 Python 的 and/or/not。
import numpy as np
arr = np.array([1, 5, 3, 8, 2])
print(arr > 3) # [False True False True False]
print(arr[(arr > 2) & (arr < 7)]) # [5 3]where()
np.where(condition, x, y) 在条件为 True 的位置返回 x 中的元素,在条件为 False 的位置返回 y 中的元素。
import numpy as np
arr = np.array([-2, 3, -1, 4, 0])
result = np.where(arr >= 0, arr, 0) # clip negatives to 0
print(result) # [0 3 0 4 0]沿轴进行聚合
指定 axis=,即可沿多维数组的特定维度进行归约。
import numpy as np
data = np.arange(12).reshape(3, 4)
print(data.mean(axis=0)) # mean of each column → shape (4,)
print(data.mean(axis=1)) # mean of each row → shape (3,)cumsum 和 diff
np.cumsum 计算累积和;np.diff 计算相邻元素之间的差值。
import numpy as np
prices = np.array([100, 110, 105, 115])
print(np.cumsum(prices)) # [100 210 315 430]
print(np.diff(prices)) # [10 -5 10] (daily changes)向量化字符串运算
np.char 为字符串数组提供向量化字符串运算。
import numpy as np
words = np.array(["apple", "banana", "cherry"])
print(np.char.upper(words)) # ['APPLE' 'BANANA' 'CHERRY']
print(np.char.startswith(words, "a")) # [True False False]与 Python 列表的性能比较
对于数值运算,NumPy 比功能等效的 Python 循环快 10 到 100 倍,因为它在 C 中执行,不会产生 Python 解释器的开销。
import numpy as np, time
n = 1_000_000
start = time.perf_counter()
python_sum = sum(i**2 for i in range(n))
print(f"Python: {time.perf_counter()-start:.3f}s")
arr = np.arange(n)
start = time.perf_counter()
numpy_sum = (arr**2).sum()
print(f"NumPy: {time.perf_counter()-start:.3f}s")快速检查
将形状为 (3,1) 的数组与形状为 (3,) 的数组相加时,结果的形状是什么?
回顾
NumPy 运算会在 C 中逐元素执行(无需 Python 循环)。广播会在不复制数据的情况下扩展兼容的形状。使用 axis= 沿特定维度进行归约。ufunc(如 np.sin 和 np.exp)会以 C 的速度逐元素执行运算。
常见问题解答
「数组运算与广播」课时是免费的吗?
是的 — 「数组运算与广播」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「数组运算与广播」这节课中我会学到什么?
执行向量化算术运算,并了解广播规则。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「数组运算与广播」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。