#### 广播机制
在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维张量,即标量;b1,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万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。
注:本文部分文字和图片来源于网络,如有侵权,请联系删除。版权归原作者所有!