美文网首页程序员数据科学 IPython 笔记本Python 数据科学手册【部分】
数据科学 IPython 笔记本 9.7 数组上的计算:广播

数据科学 IPython 笔记本 9.7 数组上的计算:广播

作者: 布客飞龙 | 来源:发表于2019-01-05 14:14 被阅读1次

9.7 数组上的计算:广播

本节是《Python 数据科学手册》(Python Data Science Handbook)的摘录。

译者:飞龙

协议:CC BY-NC-SA 4.0

我们在上一节中看到,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

结果是引人注目的二维函数的图形。

相关文章

网友评论

    本文标题:数据科学 IPython 笔记本 9.7 数组上的计算:广播

    本文链接:https://www.haomeiwen.com/subject/slirrqtx.html