1.5 NumPy数组的计算:广播
第一章 numpy入门
[toc] 1.5 数组的计算:广播
1.5.1 广播的介绍
对于同样大小的数组,二进制操作是对相应元素的逐个计算:
import numpy as np
a = np.array([1,3,5])
b = np.array([2,4,6])
c = np.ones((3,3))
print("原数组a:\n",a)
print("原数组b:\n",b)
print("元数组c:\n",c)
print("同大小数组相加:\n",a + b)
# 广播允许不同大小数组的二进制操作,如:简单的将一个标量和一个数组相加;
print("数组与标量相加:\n",a + 10)
print("二维数组与一维数组相加:\n",c + a)
x = np.arange(3)
y = np.arange(3)[:,np.newaxis]
print("原数组x:\n",x)
print("原数组y:\n",y)
print("不同二维数组间相加:\n",x + y)
原数组a:
[1 3 5]
原数组b:
[2 4 6]
元数组c:
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
同大小数组相加:
[ 3 7 11]
数组与标量相加:
[11 13 15]
二维数组与一维数组相加:
[[ 2. 4. 6.]
[ 2. 4. 6.]
[ 2. 4. 6.]]
原数组x:
[0 1 2]
原数组y:
[[0]
[1]
[2]]
不同二维数组间相加:
[[0 1 2]
[1 2 3]
[2 3 4]]
1.5.2 广播的规则
NumPy的广播遵循一组严格的规则,这顶这组规则是为了决定两个数组间的操作。
规则1:如果两个数组的维度数不相同,那么小维度的数组的形状将会在最左边补1。
规则2:如果两个数组的形状在任何一个维度上都不匹配,那么数组会沿着维度为1的维度扩展一匹配另外一个数组的形状、
规则3:如果两个数组在任意一个维度上都不匹配并且没有任何一个维度等于1,那么会引发异常。
1.广播实例1
a = np.arange(6).reshape((2,3))
b = np.arange(3)
print("数组a形状:",a.shape,"\n",a)
print("数组b形状:",b.shape,"\n",b)
# 根据规则1:数组b左边补1 变为 (1,3) ---> [[0 1 2]]
# 根据规则2:数组b沿一维扩展为 (2,3) ---> [[0 1 2]
# [0 1 2]]
print()
print("数组a + b:\n",a + b)
数组a形状: (2, 3)
[[0 1 2]
[3 4 5]]
数组b形状: (3,)
[0 1 2]
数组a + b:
[[0 2 4]
[3 5 7]]
2.广播实例2
a = np.arange(3).reshape((3,1))
b = np.arange(3)
print("数组a形状:",a.shape,"\n",a)
print("数组b形状:",b.shape,"\n",b)
# 根据规则1:数组b左边补1 变为 (1,3) ---> [[0 1 2]]
# 根据规则2:数组b沿一维扩展为 (3,3) ---> [[0 1 2]
# [0 1 2]
# [0 1 2]]
# 根据规则2:数组a沿一维扩展为 (3,3) ---> [[0 0 0]
# [1 1 1]
# [2 2 2]]
print()
print("数组a + b:\n",a + b)
数组a形状: (3, 1)
[[0]
[1]
[2]]
数组b形状: (3,)
[0 1 2]
数组a + b:
[[0 1 2]
[1 2 3]
[2 3 4]]
3.广播实例3
a = np.arange(6).reshape((3,2))
b = np.arange(3)
print("数组a形状:",a.shape,"\n",a)
print("数组b形状:",b.shape,"\n",b)
# 根据规则1:数组b左边补1 变为 (1,3) ---> [[0 1 2]]
# 根据规则2:数组b沿一维扩展为 (3,3) ---> [[0 1 2]
# [0 1 2]
# [0 1 2]]
# 根据规则3:最终形状还是不匹配,因此两个舒数组不兼容。执行会出错:
print("数组a + b:\n",a + b)
数组a形状: (3, 2)
[[0 1]
[2 3]
[4 5]]
数组b形状: (3,)
[0 1 2]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-36-4f3ac961c6c5> in <module>()
9 # [0 1 2]]
10 # 根据规则3:最终形状还是不匹配,因此两个舒数组不兼容。执行会出错:
---> 11 print("数组a + b:\n",a + b)
ValueError: operands could not be broadcast together with shapes (3,2) (3,)
1.5.3 广播的实际应用