千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Numpy广播机制

Numpy广播机制

来源:千锋教育
发布人:syq
时间: 2022-08-12 15:40:00 1660290000

  #### 广播机制

  在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万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。

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

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT