7、numpy——广播
1、广播的引出
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
>>> import numpy as np
>>> a =np.arange(,)
>>> b =np.arange(,)
>>> c=a+b
>>> c
array([ , , , , ])
>>>
对于两个形状不同的数组做运算时应该怎么进行呢?
广播机制:
a、广播机制是Numpy(开源数值计算工具,用于处理大型矩阵)里一种向量化数组操作方法。
b、Numpy的通用函数(Universal functions) 中要求输入的两个数组shape是一致的,当数组的shape不相等的时候,则会使用广播机制,调整数组使得两个shape一致,满足规则,则可以运算,否则就出错。
实例:
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], dtype=int)
print(a+b)
结果:
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
下面的图片展示了数组 b 如何通过广播来与数组 a 兼容。

4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 b 在二维上重复 4 次再运算
2、广播的规则
如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
2.1 数组维度不同,后缘维度的轴长相符
import numpy as np
arr1 = np.array([[0, 0, 0],
[1, 1, 1],
[2, 2, 2],
[3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([1, 2, 3]) #arr2.shape = (3,)
arr_sum = arr1 + arr2 # 后缘维度相同都为3
print(arr1.shape, arr2.shape)
print(arr_sum)
执行结果:
(4, 3) (3,)
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
上例中arr1的shape为(4,3),arr2的shape为(3,)。可以说前者是二维的,而后者是一维的。但是它们的后缘维度相等,arr1的第二维长度为3,和arr2的维度相同。arr1和arr2的shape并不一样,但是它们可以执行相加操作,这就是通过广播完成的,在这个例子当中是将arr2沿着0轴进行扩展。
上面程序当中的广播如下图所示:

同样的例子还有:

从上面的图可以看到,(3,4,2)和(4,2)的维度是不相同的,前者为3维,后者为2维。但是它们后缘维度的轴长相同,都为(4,2),所以可以沿着0轴进行广播。
同样,还有一些例子:(4,2,3)和(2,3)是兼容的,(4,2,3)还和(3)是兼容的,后者需要在两个轴上面进行扩展。
2.2 数组维度相同,其中有个轴为1
import numpy as np
arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([[1],[2],[3],[4]]) #arr2.shape = (4, 1)
arr_sum = arr1 + arr2
print(arr_sum)
执行结果:
[[1 1 1]
[3 3 3]
[5 5 5]
[7 7 7]]
arr1的shape为(4,3),arr2的shape为(4,1),它们都是二维的,但是第二个数组在1轴上的长度为1,所以,可以在1轴上面进行广播,如下图所示:

在这种情况下,两个数组的维度要保证相等,其中有一个轴的长度为1,这样就会沿着长度为1的轴进行扩展。这样的例子还有:(4,6)和(1,6) 。(3,5,6)和(1,5,6)、(3,1,6)、(3,5,1),后面三个分别会沿着0轴,1轴,2轴进行广播。
后话:还有上面两种结合的情况,如(3,5,6)和(1,6)是可以相加的。在TensorFlow当中计算张量的时候也是用广播机制,并且和numpy的广播机制是一样的。
7、numpy——广播的更多相关文章
- [开发技巧]·Numpy广播机制的深入理解与应用
[开发技巧]·Numpy广播机制的深入理解与应用 1.问题描述 我们在使用Numpy进行数据的处理时,经常会用到广播机制来简化操作,例如在所有元素都加上一个数,或者在某些纬度上作相同的操作.广播机制很 ...
- NumPy 广播(Broadcast)
NumPy 广播(Broadcast) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b ...
- numpy广播机制,取特定行、特定列的元素 的高级索引取法
numpy广播机制,取特定行.特定列的元素 的高级索引取法 enter description here enter description here
- 初探numpy——广播和数组操作函数
numpy广播(Broadcast) 若数组a,b形状相同,即a.shape==b.shape,那么a+b,a*b的结果就是对应数位的运算 import numpy as np a=np.array( ...
- NumPy 广播机制(Broadcasting)
一.何为广播机制 a.广播机制是Numpy(开源数值计算工具,用于处理大型矩阵)里一种向量化数组操作方法. b.Numpy的通用函数(Universal functions) 中要求输入的两个数组sh ...
- numpy广播
(m,n) +,-,*,/ (m,1) 先将(m,1)复制n次,构成(m,n)矩阵,然后再进行+,-,*,/运算 (m,n) +,-,*,/ (1,n) 先将 (1,n)复制m次,构成(m ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 广播(Broadcast)
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b 形状相同,即满足 a.shape == ...
- Numpy 广播(Broadcast)
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b 形状相同,即满足a.shape == b ...
- pytorch & numpy广播法则
广播法则 所有数组向维度最高的数组看齐,若维度不足则在最前面的维度用1补齐 扩展维度后,所有数组在某一维度相同或者长度为1,否则不能计算 当可以计算时,将长度为1的维度扩展为另一数组相应维度的长度 a ...
随机推荐
- 为什么有线宽带提供商获得ASN非常重要?
光纤和同轴电缆的组合(数据有线电视服务接口规范),由此产生的网络在世界引入了高速互联网接入.我们能够从网络运营中心向家庭用户提供10Mbps的下载速度. 拥有自己的自治系统编号(ASN)和IP块意味着 ...
- Clean Docker <none>:<none>
https://www.projectatomic.io/blog/2015/07/what-are-docker-none-none-images/ Reference: https://www.p ...
- Web核心之JSP
JSP JSP = HTML + Java + JSP自己的一些语法 JSP也是一个动态网页开发技术. JSP本质 Jsp实际上就是一个Servlet,在jsp被访问时,tomcat会把jsp转换为一 ...
- [BZOJ] 聚会
问题描述 Y 岛风景美丽宜人,气候温和,物产丰富.Y 岛上有 N 个城市,有 N-1 条城市间的道路连接着它们.每一条道路都连接某两个城市.幸运的是,小可可通过这些道路可以走遍 Y岛的所有城市. 神奇 ...
- Python配置模块:configparser参数含义
https://blog.csdn.net/CoderPai/article/details/80420698
- Selenium-Switch与SelectApi介绍
Switch 我们在UI自动化测试时,总会出现新建一个tab页面,弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了.需要用到Se ...
- Spring学习总结(1)- IOC
一.Spring框架概述 Spring是一个开源免费的框架,为了解决企业应用开发的复杂性而创建.Spring框架是一个轻量级的解决方案,可以一站式地构建企业级应用.Spring是模块化的,所以可以只使 ...
- C# 与 C++,语法差别有多小-第三章 C++数据类型 第一部分
一,数据类型 C++: char int short long float double, unsigned long double(128位,19位有效数字), wchar_t, 浮点型文字常量 ...
- 又联考了一场,感觉自己好菜啊,T2推出了公式但是不会逆元QAQ,难受啊!!!不过都确实是一道逆元的好题撒!
简单的玄学(random) 题目描述: 样例输入: 样例1: 3 2 样例2: 1 3 样例3: 4 3 样例输出: 样例1: 1 8 样例2: 1 1 样例3: 23 128 提示: 时间限制:10 ...
- 【HDOJ6656】Kejin Player(期望DP)
题意:玩一个共有n级的游戏,i级出发每次可以花a[i]的代价,有p[i]的几率变成i+1级,有1-p[i]的几率变成x[i]级,x[i]<=i 多次询问,每次询问从l级升到r级的期望总代价 n, ...