numpy广播机制

2023-11-17

NumPy的广播机制

Broadcast

  • 广播是numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组a和b形状相同,即a.shape==b.shape为True时,那么a*b的结果就是a与b数组的对应位相乘。这要求维数相同,并且各维度的长度相同。

    例如:

    import numpy as np
    
    a = np.array([1, 2, 3])
    b = np.array([4, 5, 6])
    print(a*b)
    
    
    # 运行结果为array([4,10,18])
    

    最简单的广播机制

    当一个常数与一个array对象相乘时,这时就会触发numpy的广播机制

    import numpy as np
    
    a = np.array([1, 2, 3])
    print(a*2)
    
    
    # 运行结果为array([2,4,6])
    

    或许你把这当作理所应当,但是这就是通过广播机制来实现的。

    image-20220531203320430

稍微复杂的广播机制

import numpy as np
a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([1, 2, 3])
print(a+b)

输出结果是:

array([[ 1,  2,  3],
       [11, 12, 13],
       [21, 22, 23],
       [31, 32, 33]])

初学者可能认为这样的运算会报错,但是这的确是正确的,原因还是广播机制

广播机制到底做了什么

我们观察上面这个稍显复杂的例子:

a.shape=(4,3)b.shape=(1,3),两个矩阵axis=1的数据宽度是相同的,但是axis=0的数据宽度不一样,并且b.shape[0]=1,这就是广播机制的触发条件,这时numpy会把b沿axis=0的方向复制4份,即形状变成(4, 3),与a的一致,接下来就是对应位相加即可。

如下图:

image-20220531205124124

一个典型的错误案例

image-20220531214301106

import numpy as np
a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([0, 1, 2, 3])
a+b

提示无法进行广播:

image-20220531210103341

能否广播必须从数组的最高维向最低维看去( a x i s ↓ axis\downarrow axis),依次对比两个要进行运算的数组的axis的数据宽度是否相等,如果在某一个axis下,一个数据宽度为1,另一个数据宽度不为1,那么numpy就可以进行广播;但是一旦出现了在某个axis下两个数据宽度不相等,并且两者全不为1的状况,就无法广播。

一个正确的经典示例

import numpy as np
a = np.arange(6).reshape((2, 3, 1))
b = np.arange(6).reshape((1, 3, 2))
print(a)
print(b)
print(a+b)
print((a+b).shape)

结果:

a是:
array([[[0],
        [1],
        [2]],

       [[3],
        [4],
        [5]]])
        
b是:
array([[[0, 1],
        [2, 3],
        [4, 5]]])
        
a+b是:
array([[[ 0,  1],
        [ 3,  4],
        [ 6,  7]],

       [[ 3,  4],
        [ 6,  7],
        [ 9, 10]]])

运算过程是:

  • 1不等于2,所以对a的axis=2进行广播,a变为

    array([[[0,0],
            [1,1],
            [2,2]],
    
           [[3,3],
            [4,4],
            [5,5]]])
    
  • axis=1时3等于3,不进行广播

  • axis=0时,2不等于1,所以对b的axis=0进行广播,b变为:

    array([[[0, 1],
            [2, 3],
            [4, 5]],
      
           [[0, 1],
            [2, 3],
            [4, 5]]])
    
  • 最后a、b的shape变为一样,运算结果即为:

    array([[[ 0,  1],
            [ 3,  4],
            [ 6,  7]],
    
           [[ 3,  4],
            [ 6,  7],
            [ 9, 10]]])
    

一种更便捷的计算方式

注:np.newaxis表示增加一个数据宽度为1的维度

因此a[:, np.newaxis] = array([[0],[10],[20],[30]])

import numpy as np
a = np.array([0, 10, 20, 30])
b = np.array([0, 1, 2])
a[:, np.newaxis]+b

结果:

array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

广播过程:

image-20220531214820631

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numpy广播机制 的相关文章

  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P

随机推荐

  • 如何在EngineeringVillage(EI Compendex)检索中文期刊

    工作环境 蓝色粗体字为特别注意内容 1 系统环境 Win7 Ultimate sp1 2 软件环境 Google Chrome浏览器 3 参考文献 https info b2b168 com s168 51687540 html 有时候我们
  • 官网下载python,下载pycharm

    一 下载python 访问python官网 https www python org downloads 点击 Downloads Windows 选择要下载的历史版本 点击 保存本地路径即可完成下载 二 下载pycharm 访问pycha
  • 结构体大小计算

    求结构体的大小是我们面试经常考察的一个问题 必须熟练的掌握 首先我们必须懂结构体的内存对齐规则 如下 1 第一个成员在与结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 对齐数 的整数倍的地址处 对齐数 编译器默认的对齐数 v
  • Unittest 之 DDT 的原理解析

    引言 前面的文章介绍了如何在 Python 的 Unittest 框架中来使用 ddt 实现数据驱动的自动化测试 在了解了 ddt 的使用后 你是否有过如下疑问 ddt 是如何把你的测试数据转换传给你的测试用例 当你的一组数据有多个参数时
  • 损失函数(IoU、GIoU、DIoU、CIoU)

    一 IoU 1 笔记原页 IoU Loss 1 IoU 2 IOU优缺点 目标检测中常常用iou来衡量proposal或anchor和gt之间的重合度 也就是他们之间的交并比 是目标检测中重要的评价尺度 鲜明的特点就是对尺度scale不敏感
  • 0/1背包问题(递归求解)

    0 1背包问题 0 1背包问题是十分常见的算法 下面我就是我对此问题的分析 引言 一想到0 1背包问题 首先会想到用递归求解 但此问题的递归不像数学公式中的递归那么简单 首先是此问题的分支比较多 需要判断背包的容量是大于 小于还是等于当前物
  • 正则表达式大全,一篇前后端都可用

    正是掌握了这些正则表达式 冰河平均每天比别人少写200行代码 极大的提高了研发效率 熟练的掌握正则表达式 能够帮助程序员以最快的速度写出最优雅的代码 冰河在多年的编程工作中 对使用过的正则表达式进行了梳理和总结 这些正则表达式能够帮助你节省
  • es7 的 await, async function

    es7 的 await async function 简单概念 await The await operator is used to wait for a Promise It can only be used inside an asy
  • docker启动mysql

    docker pull mysql docker run itd p 3306 3306 name mysql v root mysql data var lib mysql e MYSQL ROOT PASSWORD 123456 mys
  • mysql 类型 bigint_MySQL的bigint类型

    bigint支持的数字的大小范围为 19位 存电话号码 有符号范围 9223372036854775808 到 9223372036854775807 int支持的数字范围为 10位 有符号范围 2147483648 到 214748364
  • 如何在Ubuntu20下安装Android studio

    安装jdk 安装jdk 安装Android studio 的前提是要先配置好 jdk 环境 我这里下载的是 jdk 8u251 linux x64 tar gz 解压到指定文件夹下 tar zxvf jdk 8u251 linux x64
  • epoch、batch、batch size和mini-batch的区别

    epoch batch batch size和mini batch的区别 epoch batch batch size和mini batch都是深度学习中常见的名词 初学时经常混淆 在此整理 epoch 当一个完整的数据集经过神经网络一次
  • QSettings使用中出现的问题及正确示例

    为什么80 的码农都做不了架构师 gt gt gt 背景 使用QSettings读写配置文件 示例及需要注意的问题 写配置文件 QSettings settings Option ini QSettings IniFormat settin
  • [900]mysql字符串数字互转

    文章目录 字符串转数字 CAST 函数转化为整数 CAST 函数转化为浮点数 CONVERT方法转化为整数 CONVERT方法转化为浮点数 数字转为字符串 CONVERT方法转化为字符串 字符串转数字 最简单的方式就是直接在字符串后面 0
  • #systemverilog# 之 event region 和 timeslot 仿真调度(九)assign 赋值 和 always 组合赋值的调度区别

    有时候 我们会发现一个问题 举个最简单的例子 比如将两个信号进行简单的异或运算 该逻辑运算 我们可以使用 assign 数据流建模完成 也可以使用always 组合逻辑过程赋值语句实现 那仿真工具在对它进行调度的时候 有什么区别吗 不慌 今
  • Ubuntu安装可视化界面ElasticSearch-head插件

    1 下载地址 GitHub mobz elasticsearch head A web front end for an elastic search cluster 上传并解压 root zq virtual machine home e
  • 一次url请求的过程

    1 HTTP协议 超文本传输协议 Hyper Text Transfer Protocol HTTP 一个简单的请求 响应协议 指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应 2 域名解析 DNS Domain Name Sy
  • 如何开启bios虚拟化

    要开启 BIOS 虚拟化 首先需要进入 BIOS 设置 通常可以在电脑启动时按下 F2 或 Del 键进入 具体操作可能因电脑品牌和型号而异 在 BIOS 设置中 需要找到 虚拟化支持 或 硬件虚拟化 选项 并将其设置为 开启 有些电脑可能
  • 货币的教训——汇率与货币系列评论

    这本书中介绍了中国的人民币的具体的流转形式 就是不知到底准确否 2013 9 29
  • numpy广播机制

    NumPy的广播机制 文章目录 NumPy的广播机制 Broadcast 最简单的广播机制 稍微复杂的广播机制 广播机制到底做了什么 一个典型的错误案例 一个正确的经典示例 一种更便捷的计算方式 Broadcast 广播是numpy对不同形