9.7 数组上的计算:广播
本节是《Python 数据科学手册》(Python Data Science Handbook)的摘录。
译者:飞龙
我们在上一节中看到,NumPy 的通用函数如何用于向量化操作,从而消除缓慢的 Python 循环。向量化操作的另一种方法是使用 NumPy 的广播功能。广播只是一组规则,用于在不同大小的数组上应用二元ufunc
(例如,加法,减法,乘法等)。
广播简介
回想一下,对于相同大小的数组,二元操作是逐元素执行的:
import numpy as np
a = np.array([0, 1, 2])
b = np.array([5, 5, 5])
a + b
# array([5, 6, 7])
广播允许在不同大小的数组上执行这类二元操作 - 例如,我们可以轻松将数组和标量相加(将其视为零维数组):
a + 5
# array([5, 6, 7])
我们可以将此视为一个操作,将值5
拉伸或复制为数组[5,5,5]
,并将结果相加。
NumPy 广播的优势在于,这种值的重复实际上并没有发生,但是当我们考虑广播时,它是一种有用的心理模型。
我们可以类似地,将其扩展到更高维度的数组。 将两个二维数组相加时观察结果:
M = np.ones((3, 3))
M
'''
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
'''
M + a
'''
array([[ 1., 2., 3.],
[ 1., 2., 3.],
[ 1., 2., 3.]])
'''
这里,一维数组a
被拉伸,或者在第二维上广播,来匹配M
的形状。
虽然这些示例相对容易理解,但更复杂的情况可能涉及两个数组的广播。请考虑以下示例:
a = np.arange(3)
b = np.arange(3)[:, np.newaxis]
print(a)
print(b)
'''
[0 1 2]
[[0]
[1]
[2]]
'''
a + b
'''
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
'''
就像之前我们拉伸或广播一个值来匹配另一个的形状,这里我们拉伸a```和
b``来匹配一个共同的形状,结果是二维数组!
这些示例的几何图形为下图(产生此图的代码可以在“附录”中找到,并改编自 astroML 中发布的源码,经许可而使用)。
png结果是引人注目的二维函数的图形。
网友评论