第10节,强大的广播

1. 普通的广播

先创建一个数组

import numpy as np

array = np.arange(1, 5)
print(array)        # [1 2 3 4]

现在,我想让数组里的每一个数都变为原来的两倍,如果是用列表,难免要写一个列表推导式了,但是用numpy就不需要,只需要整个数组乘以2就可以

import numpy as np

array = np.arange(1, 5)
array = array*2
print(array)        # [2 4 6 8]

2 被填充为[2 2 2 2], 同array具有了相同的维度,对应元素之间相乘就是最终结果。

2. 维度相同的两个数组之间的广播

import numpy as np

array_1 = np.arange(1, 5)
array_2 = np.arange(2, 6)

print(array_1, array_2)     # [1 2 3 4] [2 3 4 5]

array_3 = array_1 + array_2
print(array_3)      # [3 5 7 9]

array_1和array_2拥有相同的维度,两者之间做加法,广播成为相同索引位置上的元素之间的加法。在这个例子里,两个数组的形状是相同的,当两个数组的形状不相同时,同样可以广播。

3. 维度不同的两个数组之间的广播

维度不同的两个数组之间也可以进行广播,但要满足特定条件,下面的两个条件,只要满足其一即可

  1. 两个数组的维度,从后向前比较大小均一致
  2. 依然从后向前比较,对应维度的大小不一致时,有一个维的大小是1就可以

两个数组的维度,从后向前比较大小一致
举例说明

import numpy as np

a = np.zeros((2, 5, 3, 4))      # 最后两个维度带下是 3 和 4
b = np.zeros((3, 4))            # 最后两个维度带下是 3 和 4
print((a*b).shape)   # (2, 5, 3, 4)

a = np.zeros((4))               # 最后一个维度大小是4
b = np.zeros((3, 4))            # 最后一个维度大小是4
        
print((a*b).shape)      # (3, 4)

虽然维度不同,但是从后向前比较他们维度的带下,却是一致的,

依然从后向前比较,对应维度的大小不一致时,有一个维的大小是1就可以
举例说明

import numpy as np

a = np.zeros((2, 1, 3, 4))
b = np.zeros((2, 1, 4))
print((a*b).shape)

从后向前比较,两个数组的维的大小分别是

1 3 4
2 1 4

最后一个维度的大小都是4,倒数第二个维度大小不相同,但是其中一个是1,这就符合要求了,倒数第三个维度大小也不相同,但是其中一个数组的维度大小是1,也满足要求,这样两个数组就可以进行广播了。

再举一个错误的例子

a = np.zeros((2, 1))
b = np.zeros((3, 4))
print((a*b).shape)

最后一个维度的大小,两个数组一个是1,一个是4,虽然不相同,但是有一个是1,满足条件2的要求,但倒数第二个维度的大小,一个是2,一个是3,没有一个是1,因此不符合广播的要求,程序会报错。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案