美文网首页程序员数据科学 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