【Numpy学习 10】向量化和广播

文章目录

  • 一、介绍
  • 二、示例介绍
    • 【例2-1】二维数组加一维数组
    • 【例2-2】两个数组均需要广播
    • 【例2-3】不匹配报错的例子
    • 演示


一、介绍

  1. 向量化和广播这两个概念是 numpy 内部实现的基础。有了向量化,编写代码时无需使用显式循环。这些循环实际上不能省略,只不过是在内部实现,被代码中的其他结构代替。向量化的应用使得代码更简洁,可读性更强,也可以说使用了向量化方法的代码看上去更“Pythonic”。

  2. 广播(Broadcasting)机制描述了 numpy 如何在算术运算期间处理具有不同形状的数组,让较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。并不是所有的维度都要彼此兼容才符合广播机制的要求,但它们必须满足一定的条件。
    若两个数组的各维度兼容,也就是两个数组的每一维等长,或其中一个数组为 一维,那么广播机制就适用。如果这两个条件不满足,numpy就会抛出异常,说两个数组不兼容。

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

总结来说,广播的规则有三个
1.如果两个数组的维度数dim不相同,那么小维度数组的形状将会在左边补1。
2.如果shape维度不匹配,但是有维度是1,那么可以扩展维度是1的维度匹配另一个数组;
3.如果shape维度不匹配,但是没有任何一个维度是1,则匹配引发错误;

二、示例介绍

【例2-1】二维数组加一维数组

应用规则2

import numpy as np
x = np.arange(4)
y = np.ones((3, 4))
print(x.shape) # (4,)
print(y.shape) # (3, 4)
print((x + y).shape) # (3, 4)
print(x + y)
# [[1. 2. 3. 4.]
# [1. 2. 3. 4.]
# [1. 2. 3. 4.]]

【例2-2】两个数组均需要广播

应用规则2

import numpy as np
x = np.arange(4).reshape(4, 1)
y = np.ones(5)
print(x.shape) # (4, 1)
print(y.shape) # (5,)
print((x + y).shape) # (4, 5)
print(x + y)
# [[1. 1. 1. 1. 1.]
# [2. 2. 2. 2. 2.]
# [3. 3. 3. 3. 3.]
# [4. 4. 4. 4. 4.]]

【例2-3】不匹配报错的例子

import numpy as np
x = np.arange(4)
y = np.ones(5)
print(x.shape) # (4,)
print(y.shape) # (5,)
print(x + y)
# ValueError: operands could not be broadcast together with shapes (4,) (5,)

演示

import numpy as np 
 
a = np.array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = np.array([0,1,2])
bb = np.tile(b, (4, 1))  # 重复 b 的各个维度

print(a + b)
print(a + bb)

#输出:
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

【Numpy学习 10】向量化和广播_第1张图片

参考资料:https://www.runoob.com/numpy/numpy-broadcast.html

你可能感兴趣的:(Numpy学习)