python为什么有广播机制_一文读懂NumPy中的广播机制

简介

在NumPy中如果遇到大小不一致的数组运算,就会触发广播机制。满足一定的条件才能触发广播,不然也会报错。

形状相同

形状相同的数组之间的运算就是在对应位做运算。

代码演示:

>>>import numpy as np

>>>a = np.array([[2, 2], [3, 3]])

>>>b = np.array([[1, 1], [6, 6]])

>>>a + b

array([[3, 3],

[9, 9]])

1

2

3

4

5

6

>>>importnumpyasnp

>>>a=np.array([[2,2],[3,3]])

>>>b=np.array([[1,1],[6,6]])

>>>a+b

array([[3,3],

[9,9]])

在这里使用(2, 2)和(2, 2)的数组进行加法运算,结果也是一个(2, 2)的数组。

形状不同

当数组大小不一致时,就会触发广播机制。广播机制的规则:

1.让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐;

2.输出数组的shape是输入数组shape的各个轴上的最大值;

3.如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错;

4.当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值。

这是网上对广播规则的解释。其实说的通俗点就是将两个数组的维度大小右对齐,然后比较对应维度上的数值,如果数值相等或其中有一个为1或者为空,则能进行广播运算,并且输出的维度大小为取数值大的数值。否则不能进行数组运算。

数组a大小为(2, 3)

数组b大小为(1,)

首先右对齐:

2 3

1

----------

2 3

所以最后两个数组运算的输出大小为:(2, 3)

1

2

3

4

5

6

7

8

数组a大小为(2,3)

数组b大小为(1,)

首先右对齐:

23

1

----------

23

所以最后两个数组运算的输出大小为:(2,3)

比如:

>>>import numpy as np

>>>a = np.arange(6).reshape(2, 3)

>>>a

array([[0, 1, 2],

[3, 4, 5]])

>>>b = np.array([5])

>>>b

array([5])

>>>b.shape

(1,)

>>>c = a * b

>>>c # 输出的大小为(2, 3)

array([[ 0, 5, 10],

[15, 20, 25]])

>>>c.shape

(2, 3)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

>>>importnumpyasnp

>>>a=np.arange(6).reshape(2,3)

>>>a

array([[0,1,2],

[3,4,5]])

>>>b=np.array([5])

>>>b

array([5])

>>>b.shape

(1,)

>>>c=a*b

>>>c# 输出的大小为(2, 3)

array([[0,5,10],

[15,20,25]])

>>>c.shape

(2,3)

从这里也能看出一个数组和一个数值的运算也属于广播。

再举一个例子:

数组a大小为(2, 1, 3)

数组b大小为(4, 1)

首先右对齐:

2 1 3

4 1

----------

2 4 3

所以最后两个数组运算的输出大小为:(2, 4, 3)

1

2

3

4

5

6

7

8

数组a大小为(2,1,3)

数组b大小为(4,1)

首先右对齐:

213

41

----------

243

所以最后两个数组运算的输出大小为:(2,4,3)

比如:

>>>import numpy as np

>>>a = np.arange(6).reshape(2, 1, 3)

>>>a

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

[[3, 4, 5]]])

>>>b = np.arange(4).reshape(4, 1)

>>>b

array([[0],

[1],

[2],

[3]])

>>>b.shape

(4, 1)

>>>c = a + b

>>>c

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

[1, 2, 3],

[2, 3, 4],

[3, 4, 5]],

[[3, 4, 5],

[4, 5, 6],

[5, 6, 7],

[6, 7, 8]]])

>>>c.shape

(2, 4, 3)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

>>>importnumpyasnp

>>>a=np.arange(6).reshape(2,1,3)

>>>a

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

[[3,4,5]]])

>>>b=np.arange(4).reshape(4,1)

>>>b

array([[0],

[1],

[2],

[3]])

>>>b.shape

(4,1)

>>>c=a+b

>>>c

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

[1,2,3],

[2,3,4],

[3,4,5]],

[[3,4,5],

[4,5,6],

[5,6,7],

[6,7,8]]])

>>>c.shape

(2,4,3)

从这里能够看出,两个数组右对齐以后,对应维度里的数值要么相等,要么为1,要么缺失取大值。除此之外就会报错。像下面的两个数组就不能做运算。

数组a大小为(2, 1, 3)

数组b大小为(4, 2)

首先右对齐:

2 1 3

4 2

----------

2跟3不匹配,此时就不能做运算

1

2

3

4

5

6

7

数组a大小为(2,1,3)

数组b大小为(4,2)

首先右对齐:

213

42

----------

2跟3不匹配,此时就不能做运算

比如:

>>>import numpy as np

>>>a = np.arange(6).reshape(2, 1, 3)

>>>a

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

[[3, 4, 5]]])

>>>b = np.arange(8).reshape(4, 2)

>>>b

array([[0, 1],

[2, 3],

[4, 5],

[6, 7]])

>>>a + b

File "C:\Python36-64\lib\site-packages\IPython\core\interactiveshell.py", line 2910, in run_code

exec(code_obj, self.user_global_ns, self.user_ns)

File "", line 1, in

a + b

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

>>>importnumpyasnp

>>>a=np.arange(6).reshape(2,1,3)

>>>a

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

[[3,4,5]]])

>>>b=np.arange(8).reshape(4,2)

>>>b

array([[0,1],

[2,3],

[4,5],

[6,7]])

>>>a+b

File"C:\Python36-64\lib\site-packages\IPython\core\interactiveshell.py",line2910,inrun_code

exec(code_obj,self.user_global_ns,self.user_ns)

File"",line1,in

a+b

ValueError:operandscouldnotbebroadcasttogetherwithshapes(2,1,3)(4,2)

数组之间不满足广播的规则,就会报错。

总结

广播机制能够处理不同大小的数组,数组之间必须满足广播的规则,否则就会报错。事实上,相同大小的数组运算也遵循广播机制。本文按照小编的理解解释了广播的机制,希望对大家有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值