我的编程空间,编程开发者的网络收藏夹
学习永远不晚

浅谈numpy广播机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

浅谈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])

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

稍微复杂的广播机制

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的一致,接下来就是对应位相加即可。

如下图:

一个典型的错误案例

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

提示无法进行广播:

能否广播必须从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]])

广播过程:

到此这篇关于浅谈numpy广播机制的文章就介绍到这了,更多相关numpy广播机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

浅谈numpy广播机制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

浅谈numpy广播机制

本文主要介绍了浅谈numpy广播机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-15

Android开发之广播机制浅析

对于了解Android程序设计的人都知道,广播是Android开发中的一个重要的功能,在Android里面有各式各样的广播,比如:电池的状态变化、信号的强弱状态、电话的接听和短信的接收等等,今天本文就来给大家简单介绍一下系统发送、监听这些广
2022-06-06

NumPy中的Broadcasting广播机制是什么

这篇文章主要介绍NumPy中的Broadcasting广播机制是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!广播机制概述让我们探索numpy中一个更高级的概念,这个概念被称为广播。 广播展现了NumPy在算术运
2023-06-15

【Android】 浅谈Handler机制

Handler机制产生的原因 在谈论一个机制之前,需要了解这个机制设计出来是为了解决什么问题。 Handler设计出来就是因为UI线程不能进行耗时操作,子线程不能更新UI,所以需要一种跨线程通信的机制来解决子线程跑完耗时操作之后更新UI的操
2022-06-06

浅谈Python pygame绘制机制

pygame绘制机制简介 屏幕控制 pygame.display 用来控制Pygame游戏的屏幕 Pygame有且只有一个屏幕 屏幕左上角坐标为(0,0) 以像素为单位 屏幕控制需求 游戏全屏 游戏屏幕大小可调节 游戏屏幕
2022-06-02

浅谈Java内省机制

本文主要介绍了Java内省机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

浅谈Linux信号机制

目录一、信号列表1.1、实时信号非实时信号1.2、信号状态1.3、信号生命周期1.4、信号的执行和注销二、信号掩码和信号处理函数的继承2.1、信号处理函数的继承2.2、信号掩码的继承2.3、sigwait 与多线程2.4、多进程下的信号三、
2022-06-03

浅谈node的事件机制

Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.在nodejs的官方文档中,明确写出了node的一个特
2022-06-04

浅谈Android Aidl 通讯机制

服务端:首先是编写一个aidl文件,注意AIDL只支持方法,不能定义静态成员,并且方法也不能有类似public等的修饰符;AIDL运行方法有任何类型的参数和返回值,在java的类型中,以下的类型使用时不需要导入包(import),基本数据类
2022-06-06

Android BroadcastReceiver广播机制概述

Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内
2022-06-06

怎样浅谈Java访问控制机制

怎样浅谈Java访问控制机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 访问控制机制的原理是:在某些策略配置文件中预定义好某些代码对某些资源具有某些操作权限,当
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录