numpy 广播

现在有两个数组分别为:

arr1 = [0, 1, 2, 3, 4, 5, 6]
arr2 = [1]

这两个数组可以进行广播吗?

二维数组广播:

arr1 = np.arange(0,3).reshape(1,3)

array([[0, 1, 2]])

arr2 = np.arange(4,7).reshape(3,1)

array([[4],
       [5],
       [6]])

 这两个数组可以进行广播吗?

 这两个三维数组可以进行广播吗?

array4 = np.array(np.arange(4).reshape(2,2,1))

      [[[0],
        [1]],

       [[2],
        [3]]]

array5 = np.array(np.arange(12).reshape(2, 1, 6))

[[[ 0,  1,  2,  3,  4,  5]],

       [[ 6,  7,  8,  9, 10, 11]]]

 显然可以这是为什么?

我们再看两个数组,它们之间可以通过广播操作,进行计算吗?

 我们先看看这段话:

当两个或多个数组在某个维度上的长度不相等时,如果其中至少有一个数组在这个维度上的长度为1,则它们可以进行广播运算。

array5 = np.array(np.arange(24).reshape(2, 2, 6))

[[[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]],

       [[12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23]]]
array6 = np.array(np.arange(6,14).reshape(2, 1, 4))
[[[ 6,  7,  8,  9]],

       [[10, 11, 12, 13]]]

 

显然不行? 这是为什么?看看报错:

ValueError: operands could not be broadcast together with shapes (2,2,6) (2,1,4) 

 

我们来讲讲吧? 首先我给大家举例的都是? 维度相同相同的数组,两个进行相加的数组的维度都相同,维度不相通的数组我们在后面举例,以维度相同的数组先开始.

先看这两个数组, arr1 = [0, 1, 2, 3, 4, 5, 6] 和 arr2 = [1] arr1 和 arr2 都是一位数组,而且  arr2 一维的长度只有 1 ,所以在它们之间进行操作时,arr2 可以进行扩展延伸至另一方在该维度上相同的长度。

arr2 = [1]   进行广播后     arr2 = [1, 1, 1, 1, 1, 1, 1 ],然后利用  [1, 1, 1, 1, 1, 1, 1 ]  和[0, 1, 2, 3, 4, 5, 6]  进行求和操作。

我们看看结果是不是我们想的那样?

 这两个二维数组是怎样完成的呢?

 

arr1 = np.arange(0,3).reshape(1,3)

arr2 = np.arange(4,7).reshape(3,1)

arr1 和  arr2 都是2维数组,  arr1 数组形状是|(1,3) arr2 的数组形状是 (3,1)请看这段话:

两个数组在所有维度上的长度要么相等,要么其中一个数组在对应维度的长度为1

当两个相同维度的数组上, 出现一个维度的长度不相等时,若其中任一数组在该维度上的长度为1,则可以进行广播。

arr1 怎么扩展延伸: arr1 数组在第一个维度上与arr2 不相同,但因长度为1 所以可以进行扩展,扩展到什么程度呢? 长度为1的维度就可以被“延伸到”以匹配另一个数组在该维度上的长度,从而实现广播。

arr1 原数组:                                                          arr2 原数组

[[0, 1, 2]]                                    [[4],
                                                [5],
                                                [6]]

arr1 广播后的数组                                                 arr2 广播后的数组

[[0, 1, 2],                                                                   [[4,4,4],

[0, 1, 2] ,                                                                     [5,5,5],

[0, 1, 2]]                                                                      [6,6,6] ]       

然后对扩展后的数组做操作(对应位置的元素进行求和):

 大家计算一下是不是没有问题。

三维数组也是这样玩的,但是需要大家自己主动思考我把运行数组打印给大家,大家思考如何扩展,如何求和?

array5 = np.array(np.arange(8,12).reshape(2, 2, 1))
array6 = np.array(np.arange(6,18).reshape(2, 1, 6 ))

 也很简单: 大家看相同维度的数组元素个数与排布,三维数组肯定只有三维以下数组,也即是两维和一维存在元素,四维肯定是四维以下,三维 、二维、一维数组存在元素,更高维, 同理。

现在这是三维,我们去看两个二维数组的元素个数和排布:

 行和列分别指的是第二个维度和第三个维度,这是正确的示意,我为了大家和我理解将其解释为了 红色子标注。

 前提是数组维度相同, 在相同维度的地方,有一个数组的维度长度为1,这一个维度长度为1 的维度长度,会扩展到与另一个数组维度长度相同的长度。

什么意思? arr5 二维数组的地方,是两行一列,它就会通过广播,将列扩展到和arr6列的长度 七一样大小的长度,也是七列

arr6二维数组的地方的长度 ,一行七列,它会通过广播,将行扩展到与arr5 行一样大小 2 的长度,也是 2行。

到时候 ,arr5 和 arr6 都是 两行七列,这就回到了,相同数组进行求和操作。 它们分别通过广播完成。

那维度不相同的两个数组怎么通过广播进行加法操作

前提是它们满足以下条件:

  1. 所有参与运算的数组在每个对应的维度上的长度要么相同,要么其中至少有一个数组在该维度上的长度为1。
  2. 在长度为1的维度上,这个维度将被“拉伸”以匹配其他数组的相应维度。

 # 三维数组

arr1 = np.arange(0,9).reshape(3,1,3)

      [[[0, 1, 2]],

       [[3, 4, 5]],

       [[6, 7, 8]]]   

# 二维数组

arr2 = np.arange(6,9).reshape(1,3)

[[6, 7, 8]]

 

 注意: 这句话      所有参与运算的数组在每个对应的维度上的长度要么相同

 arr1  的形状是   (3,1,3)       第一个维度长度是 : 3 ,第二个维度长度是: 1, 第三个维度长度是: 3

arr2  的形状是(1,3) 第一个维度长度是: 1, 第二个维度长度: 3, 

啊? 它们对应的维度的长度不相同啊? 不要忘了 arr1   是三维数组,它里面的二维的第一个维度的长度是 :1, 第二个维度长度是: 3, 这样不就对应了  。

因为arr2 的是二维,它如何变成三维,给他再加上一个方向,他就变成了三维,二维数组是一张表格,在深度上加一个方向,也就是再给一些表格让其垒起来。那我们再去看ndarray 数组结构是怎样表示

arr2 :

   [[6, 7, 8]]

arr2变三维:

[

   [[6, 7, 8]]

                  ]

给它外层加了一个括号。

我们对比一下arr 变成三维后和三维数组arr1的区别:

arr1:

[[[0, 1, 2]],

  [[3, 4, 5]],

  [[6, 7, 8]]]

是不是将arr2 多给两个,它们的维度、维度长度都相同了。

[

   [[6, 7, 8]],

   [[6, 7, 8]],

   [[6, 7, 8]]

                  ]

 这个向外延伸,直到和另一个数组相同大小的维度、维度长度就算完成了。

arr2 本来形状是: (1,3)给它前面加一个维度,维度长度是1 , 变为 (1,1,3)

这样就有回到了 相同维度,不相同维度长度的数据广播内容中了。

好了我发现越解释越繁琐,我心里明白了但是没办法给大家,再解释更详细点,大家有啥不同大家可以评论或者私信,我看到后会给大家解释。


 总结: 

两个数组相同维度,各其对应维度的维度长度相同或不相同:

维度长度相同: 可以直接进行操作(加减乘除)

维度长度不相同: 两个数组的对应维度必须要有一个为 1, 多个维度,只要有一个维度长度不相同,这个维度必须为1 才可以通过广播进行延伸扩展,进行两数组操作。

两个数组维度不相同,长度相同或者不相同。

长度相同: 所有参与运算的两个数组在每个对应的维度上的长度相同

长度不同:两个数组对应的维度,必须有一个为1 。 

   a = (2,3,1)   b = (1,3)    a = (2,2,2)  b = (2,2)

 


这是我今年的最后一篇文章了,祝愿国泰民安,每一个csdn 用户,安康如意

又送大家几句古语:

 修数百年崎岖之路,造千万人来往之桥

 家富提携亲戚,岁饥赈济邻朋  -  文昌帝君阴骘文

希望大家常怀悯人之心,多做好事!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/299169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑单机游戏推荐:嗜血印 BLOODY SPELL 中文版

《嗜血印》该游戏的故事发生在一个充满秘密和恐怖的江湖中。一伙自称为“灵虚教”的神秘组织闯入万法归宗门派,导致天下大乱。妹妹小鲤被掳为人质,同门师兄弟相继遭到毒手。当嗜血咒印打开的那一刻,重识自我的苏夜锦,为了守护自己…

【linux】Ubuntu 22.04.3 LTS截屏

一、快捷键 交互式录屏 ShiftCtrltAltR 交互式截图 Print 对窗口进行截图 AltPrint 截图 ShiftPrint 快捷键可能取决于使用的桌面环境和个人的键盘快捷键设置。如果上述快捷键不起作用,可能需要检查系统设置中的键盘快捷键部分,以了解系统中截图的…

【MATLAB源码-第105期】基于matlab的4PAM调制解调仿真,输出误码率和误符号曲线并且和理论值对比。

操作环境: MATLAB 2022a 1、算法描述 4PAM(4-Pulse Amplitude Modulation,4脉冲幅度调制)是一种数字调制技术,它通过改变载波信号的幅度来表示数据。在4PAM中,载波的幅度可以采用四种不同的水平&#xf…

AcWing 998. 起床困难综合症

原题链接 其实上面这一堆就是想说,输入 n,m以及 n 个数和该数所对应的运算,其中运算包括有 与、或、异或 三种,真正的问题就是在所有不大于 m 的数(非负数)中,对给定的 n 个数都按该数所对应的运算运算一遍…

visi 各版本安装指南

visi下载链接 https://pan.baidu.com/s/1WNksdiChCPebPvRRSVakOA?pwd0531 1.鼠标右键【visi2021(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)选择【解压到 visi2021(64bit)】。 2.打开解压后的文件夹,鼠标右击【Setup VISI 2…

竞赛练一练 第27期:GESP和电子学会相关题目练习

GESP一级2023.03_小猫捉老鼠 1. 准备工作 (1)导入背景Room 2; (2)删除默认小猫角色,导入角色Mouse1、Cat 2。 2. 功能实现 (1)点击绿旗,老鼠出现在随机位置; (2)通过键盘的“↑”、“↓”、“←”、“→”键来控制小猫行走,每按一次,移动5步; (3)小猫在…

GoLang:gRPC协议的介绍以及详细教程,从Protocol开始

目录 ​编辑 引言 一、安装相关Go语言库和相关工具 1. 安装Go 2. 安装Protocol Buffers Compiler 2.1 Windows 2.1.1 下载 2.1.2 解压 2.1.3 环境变量 2. macOS 3. Linux 4. 验证安装 3. 安装gRPC-Go 4. 安装Protocol Buffers的Go插件 二、定义服务 三、生成Go…

论文笔记 Understanding Electricity-Theft Behavior via Multi-Source Data

WWW 2020 oral 1 INTRO 1.1 背景 1.1.1 窃电 窃电(electricity theft)指用户为了逃避电费而进行非法操作的一种行为 常用的反窃电方法可分为两类: 基于硬件驱动的反窃电方法 ​​​​​​​电表开盖检测、集中器检测。。。。 硬件驱动的…

腾讯云3年轻量应用服务器2核2G4M和2核4G5M性能测评

腾讯云优惠之轻量应用服务器3年优惠价格表,目前可以买三年的轻量配置为2核2G4M和2核4G5M,2核2G4M价格三年价格540元,2核4G5M带宽三年756元,当然也可以选择购买一年,第二年续费会比较贵,腾讯云轻量2核2G4M服…

多功能号卡推广分销管理系统 流量卡推广分销网站源码-目前市面上最优雅的号卡系统

一套完善,多功能,的号卡分销系统,多接口,包括运营商接口,无限三级代理,最简单易用的PHP~ 目前市面上最优雅的号卡系统!没有之一 软件架构说明 环境要求php7.3以上(建议低于8.0),MySQL5.6以上,Nginx1.16(无要求) 产品特性 自动安装向导 易于安装使用部署 多个第…

不是小米SU7买不起,而是17.58万的银河E8更有性价比

作者 |Amy 编辑 |德新 疯狂的2023年车市已过。这一年,新势力与传统车企自主品牌在新能源战略上多次交锋。 新能源汽车市场不再由新势力独领风骚,传统车企的新能源品牌进步迅猛,增长势头强劲。 以吉利汽车集团为例,2023年其新能…

1-01初识C语言

一、概述 C语言是贝尔实验室的Ken Thompson(肯汤普逊)、Dennis Ritchie(丹尼斯里奇)等人开发的UNIX 操作系统的“副产品”,诞生于1970年代初。 Thompson和Ritchie共同创作完成了Unix操作系统,他们都被称为…

解析数据链路层——组帧

组帧是数据链路层的重要功能之一,它将较长的数据分割成较小的帧以便在网络中传输。在本文中,我们将深入探讨组帧的概念、目的以及常见的组帧技术。 组帧是将数据封装成具有一定格式的帧的过程。帧是数据链路层传输的基本单位,它包含了有效数…

模糊综合评价

第一步:确定评价指标集 确定评语集:如好,很好 第二步:求出模糊评价矩阵P 其中Pij表示方案X在第i个指标处于第j级评语等等隶属度 并且在此阶段需要确认各指标的权系数向量A 第三步:利用矩阵的模糊乘法得到综合评价…

InternLM第2节课作业

基础作业 使用 InternLM-Chat-7B 模型生成 300 字的小故事 熟悉 hugging face 下载功能,使用 huggingface_hub python 包,下载 InternLM-20B 的 config.json 文件到本地

【算法专题】FloodFill 算法

FloodFill 算法 1. 图像渲染 题目链接 -> Leetcode -773.图像渲染 Leetcode -773.图像渲染 题目:有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr, sc 和 newColor 。你应该从…

腾讯云轻量应用服务器可以一次性买三年,2核2G4M和2核4G5M

腾讯云优惠之轻量应用服务器3年优惠价格表,目前可以买三年的轻量配置为2核2G4M和2核4G5M,2核2G4M价格三年价格540元,2核4G5M带宽三年756元,当然也可以选择购买一年,第二年续费会比较贵,腾讯云轻量2核2G4M服…

Unity中Shader面片一直面向摄像机(实现思路)

文章目录 前言一、实现思路1、 我们要实现模型面片一直跟着摄像机旋转,那么就需要用到旋转矩阵2、确定 原坐标系 和 目标坐标系3、确定旋转后坐标系基向量 二、确定旋转后 坐标系基向量 在 原坐标系 下的值1、Z轴基向量2、假设Y轴基向量 和 世界空间下 的Y轴方向一致…

SpringCloud-高级篇(十二)

在主从集群中slave节点发生了宕机,不用担心,只要它重启就能从master节点上完成数据的同步,恢复数据,如果宕机的不是slave而是master,是不是master重启就可以呢?如果你做了master节点的数据持久化&#xff0…

如何在GitHub正确提PR(Pull Requests),给喜欢的开源项目贡献代码

最好的中文TTS项目Bert-vits2更新了中文特化分支,但可能由于时间仓促,代码中存在不少的bug,作为普通用户,有的时候也想为自己喜欢的开源项目做一点点贡献,帮助作者修改一些简单的bug,那么该如何开始&#x…