全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

Numpy广播机制

发布时间:2022-08-12 15:40:00
发布人:syq

  #### 广播机制

  在Numpy中当数组进行运算时,如果两个数组的形状相同,那么两个数组相加就是两个数组的对应位相加,这是要求维数相加,并且各维度的长度相同。比如:

Numpy广播机制

  ```

  import numpy as np

  data1 = np.arange(9,dtype=np.int32).reshape(3,3) # 维数是(3,3)

  data2 = np.ones((3,3),dtype=np.int32) # 维数是(3,3)

  # 两个相加

  print(data1+data2)

  ```

  原来两个数是:

  ```

  [[0 1 2]

  [3 4 5]

  [6 7 8]]

  [[1 1 1]

  [1 1 1]

  [1 1 1]]

  ```

  相加之后的结果:

  ```

  [[1, 2, 3],

  [4, 5, 6],

  [7, 8, 9]]

  ```

  当运算中两个数组的形状不同使时,numpy将会自动触发广播机制,那什么是广播机制呢?

  复习下数学知识,在线性代数中我们曾经学到过如下规则:

  a1 =3 ,a2 = 4,a1,a2是0维张量,即标量;向量向量2b1,b2是1维张量,即向量; c1,c2是如下所示的2维张量,即矩阵:  

矩阵

  a1与a2之间可以进行加减乘除,b1与b2可以进行逐元素的加减乘除运算,c1与c2之间可以进行逐元素的加减乘除以及矩阵相乘运算(矩阵相乘必须满足维度的对应关系),而a与b,或者b与c之间不能进行逐元素的加减乘除运算,原因是他们的维度不匹配。而这种在数学方面的不可能在NumPy中,就可以通过广播完成这项操作。

  再比如:

  ```

  import numpy as np

  data1 = np.arange(9,dtype=np.int32).reshape(3,3) # 维数是(3,3)

  print(data1+1)

  ```

  此时data1是3行3列的矩阵,跟一个1进行运算,能否成功呢?在Numpy中这时ok的。data1中的每个元素都会跟1相加而得到一个新的矩阵。这就是广播机制。所以结果就是:

  ```

  [[1 2 3]

  [4 5 6]

  [7 8 9]]

  ```

  如果是跟一个3行1列的进行加法呢?

  ```

  import numpy as np

  data1 = np.arange(9,dtype=np.int32).reshape(3,3) # 维数是(3,3)

  data2 = np.array([[1],[2],[3]])

  print(data1+data2)

  ```

  这个操作也是ok的,结果是:

  ```

  [[ 1 2 3]

  [ 5 6 7]

  [ 9 10 11]]

  ```

  如果是跟一个2行3列的数据进行加法运算呢?

  ```

  import numpy as np

  data1 = np.arange(9,dtype=np.int32).reshape(3,3) # 维数是(3,3)

  data2 = np.array([[1,2,3],[1,1,1]])

  print(data1+data2)

  ```

  此时会报错:

  ```

  ---------------------------------------------------------------------------

  ValueError Traceback (most recent call last)

  in

  ----> 1 print(data1+data2)

  ValueError: operands could not be broadcast together with shapes (3,3) (2,3)

  ```

  报错的原因是什么呢?我们一起来看一张图  

广播示意图

  所以广播的规则是:

  1. 形状相同的广播

  ```

  import numpy as np

  data1 = np.arange(9,dtype=np.int32).reshape(3,3)

  print(data1+data1)

  ```

  2. 相同维度,但其中某一个或多个维度长度为 1 的广播:

  ```

  import numpy as np

  data1 = np.arange(9,dtype=np.int32).reshape(3,3) # 维数是(3,3)

  data2 = np.array([[1],[2],[3]])

  print(data1+data2)

  data2 = data2.T

  print(data1+data2)

  ```

  3. 如果是标量的话,会广播整个数组上

  ```

  import numpy as np

  data1 = np.arange(9,dtype=np.int32).reshape(3,3) # 维数是(3,3)

  print(data1+5)

  ```

  所以我们要首先了解numpy的广播机制,接下来才能更好的进行数组的运算。

  更多关于“Python培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。

  注:本文部分文字和图片来源于网络,如有侵权,请联系删除。版权归原作者所有!

相关文章

反欺诈中所用到的机器学习模型有哪些?

反欺诈中所用到的机器学习模型有哪些?

2023-10-14
强化学习中on-policy与off-policy有什么区别?

强化学习中on-policy与off-policy有什么区别?

2023-10-14
为什么交叉熵可以用于计算代价?

为什么交叉熵可以用于计算代价?

2023-10-14
开发网上平台的大概流程有什么?

开发网上平台的大概流程有什么?

2023-10-14

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取