5-Numpy数组广播

广播

广播允许在不同大小的数组上执行加减乘除的二进制运算 例如

In [1]: import numpy as np

In [2]: a = np.array([0, 1, 2])
   ...: b = np.array([5, 5, 5])

In [3]: a*b
Out[3]: array([ 0,  5, 10])

NumPy广播的优点是在复制值得过程中没有占用额外得空间,但是在我们考虑广播时,它是一种有用的思维模型。
例如如下对三维数组数值扩展

In [8]: m=np.ones((3,3))
In [9]: 3+m
Out[9]: 
array([[4., 4., 4.],
       [4., 4., 4.],
       [4., 4., 4.]])

两个数组相加扩展

In [17]: a = np.arange(3)
    ...: b = np.arange(3)[:, np.newaxis]
    ...: print(a)
    ...: print(b)
[0 1 2]
[[0]   
 [1]   
 [2]]  
# 两个数组相加(注意数组非矩阵)
In [18]:a + b
Out[18]: 
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])

就像我们拉伸或广播一个值以匹配另一个值的形状一样,这里拉伸了a和b以匹配一个通用形状,结果是一个二维数组!
下图显示了这些示例的几何形状(可以在附录中找到生成该图的代码,并改编自astroML文档中发布的源)。
[图片上传失败...(image-d405c3-1584512066939)]

这些图中额外的内存实际上并没有在操作过程中分配.这里时为了从概念理解。

广播得规则

NumPy中的广播遵循一套严格的规则来确定两个数组之间的交互:

规则1:如果两个数组的维数不同,则维数较少的数组的形状将在其前(左侧)填充。
规则2:如果两个数组的形状在任何维度上都不匹配,则将在该维度上形状等于1的数组拉伸以匹配其他形状。
规则3:如果尺寸在任何维度上都不相同,且都不等于1,则会引发错误。

广播示例1

下面详细来说明

In [23]: M = np.ones((2, 3))
  ...: a = np.arange(3)
  • 首先创建得两个数组,M 为2行3列的二维数组,a为一个1行的一维数组
  1. 首先根据规则1,我们看到数组a的维数较少,因此我们在数组的左侧填充了1维使其成为和M相同维度的二维数组:

    M.shape -> (2, 3)
    a.shape -> (1, 3)

  2. 根据规则2,我们现在看到维度相同,但是尺寸不一致,因此我们拉伸该维度以使其匹配:

    M.shape -> (2, 3)
    a.shape -> (2, 3)
    最终我们通过拉伸变换使其形状匹配,我们看到最终形状将是(2,3):

In [23]: M = np.ones((2, 3))
    ...: a = np.arange(3)
In [24]: M+a
Out[24]: 
array([[1., 2., 3.],
       [1., 2., 3.]])

广播示例2

让我们看下两个数组都需要拉伸变换来适应匹配的

In [28]: a = np.arange(3).reshape((3, 1))
    ...: b = np.arange(3)
  1. 首先我们创造一个,3*1的二维数组和一个一维数组

    a.shape = (3, 1)
    b.shape = (3,)

  2. 规则1说我们必须填充b的形状使其形成二维数组(1行3列):

    a.shape -> (3, 1)
    b.shape -> (1, 3)

  3. 根据规则2,我们将每个升级,以匹配另一个数组的相应大小(都扩展成3*3的数组):

In [30]: a+b
Out[30]: 
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])

广播示例3

我们在看两个不匹配的数组

In [31]: M = np.ones((3, 2))
    ...: a = np.arange(3)
    

考虑上面a和M,分析简略如下
首先a M

M.shape = (3, 2)
a.shape = (3,)

根据规则一,对a扩展成

M.shape -> (3, 2)
a.shape -> (1, 3)

根据规则2,对a 的行扩展

M.shape -> (3, 2)
a.shape -> (3, 3)

扩展后我们发现,两者不匹配执行

In [32]: a+M
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-32-60afc280ce5f> in <module>

*此处可能存在的混乱:可以想象通过将a的形状用右边而不是左边的形状填充来使a和M兼容。但这不是广播规则的工作方式!这种灵活性在某些情况下可能有用,但可能会导致歧义。如果想要右侧填充,则可以通过重塑数组来明确地做到这一点(我们将使用《 NumPy数组基础》中引入的np.newaxis关键字):

# 将a变换 成3*1的数组和M广播
In [34]: a[:, np.newaxis].shape
Out[34]: (3, 1)

In [35]: M + a[:, np.newaxis]
Out[35]: 
array([[1., 1.],
       [2., 2.],
       [3., 3.]])

*同样除了+ 还可以用于其他函数例如log等

广播操作练习

在上一节中,我们看到ufunc允许NumPy用户消除显式编写慢速Python循环的需要。广播扩展了此功能。一个常见的示例是将数据阵列居中时。假设您有一个包含10个观测值的数组,每个观测值包含3个值。,我们将其存储在10×3数组中:

In [43]: a=np.arange(9).reshape((3,3))
In [44]: a
Out[44]:         
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
#我们可以使用第一维上的均值合计来计算每个特征的均值:
In [46]: a.mean(0)
Out[46]: array([3., 4., 5.])

绘制二维函数

广播非常有用的一个地方是基于二维函数显示图像。如果我们要定义一个函数z= f(x,y),可以使用广播来计算整个网格中的函数
这里我们用py代码执行

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
#我们将使用Matplotlib绘制此二维数组(这些工具将在“密度和轮廓图”中进行全面讨论):
import matplotlib.pyplot as plt
x=np.linspace(0,5,50)
y=np.linspace(0,5,50)[:,np.newaxis]
z=np.sin(x)**2 + np.cos(6+y*x)*np.cos(x)
plt.imshow(z, origin='lower', extent=[0, 5, 0, 5],cmap='viridis')
plt.colorbar();
plt.show()  #关键的地方

[图片上传失败...(image-8ea90c-1584512066939)]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容