Numpy 广播
在 NumPy 中,广播是指 numpy 对不具有相同形状的数组进行统一操作的能力。简而言之,广播是一种机制,它使 NumPy 能够在不进行复制操作的情况下执行各种数学运算。
阅读更多:Numpy 教程
广播规则
当对两个数组进行操作时,NumPy 会逐个比较它们的形状是否相符。以下是它的广播规则:
- 如果数组不具有相同的秩,则将较低秩的数组进行扩维,直到两个数组的秩均相同;
示例:
arr1 = np.array([1, 2, 3]) arr2 = np.array([[1, 2, 3], [4, 5, 6]]) print(arr1.shape) # (3,) print(arr2.shape) # (2, 3) # 扩维后的形状为 (1, 3) 和 (2, 3),直接做加法 print(arr1 + arr2) # array([[2, 4, 6], [5, 7, 9]]) - 如果数组的形状在某个维度上不相等,且不等于 1,则不能进行计算。抛出异常 ValueError:”operands could not be broadcast together”;
示例:
arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([1, 2, 3]) print(arr1.shape) # (2, 2) print(arr2.shape) # (3,) # 在第 1 维上不相等 print(arr1 + arr2) # ValueError: operands could not be broadcast together with shapes (2,2) (3,) - 如果两个数组的形状在某个维度上不相等,但其中一个数组的形状为 1,则可以进行计算;
示例:
arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([1, 2]) print(arr1.shape) # (2, 2) print(arr2.shape) # (2,) # 将 arr2 扩维后,形状与 arr1 相同,直接做乘法 print(arr1 * arr2.reshape(2, 1)) # array([[1, 2], [6, 8]])
广播应用
广播可以让我们在 NumPy 中快速地处理不同形状的数据。
1. 图像处理
图像处理中经常会用到广播,例如图像加法、图像相加减等操作。以下是一个将两张图片进行叠加的示例代码:
import cv2
import numpy as np
img1 = cv2.imread("img1.png")
img2 = cv2.imread("img2.png")
# 将两幅图像进行加法操作,实际上就是像素值相加
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imwrite("dst.png", dst)
其中 addWeighted 方法就是利用广播规则进行像素值相加。
2. 矩阵乘法
在矩阵乘法中,广播可以方便地实现矩阵的扩张和压缩。例如,将矩阵 A 的第一行乘以矩阵 B,可以这样实现:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([1, 0, -1])
print(a.shape) # (2, 3)
print(b.shape) # (3,)
# 将 b 扩展成 2 x 3 的矩阵,然后再进行乘法
print(a * b.reshape(1, -1)) # array([[ 1, 0, -3], [ 4, 0, -6]])
这里利用了广播的规则,将矩阵 B 扩充为与矩阵 A 相同的形状,然后再进行乘法。
总结
广播是 NumPy 中重要的功能之一,它可以帮助我们处理不同形状的数据,做到快速且便捷的运算。掌握广播的规则和应用,将会对我们的数据处理和分析带来很大的帮助。
极客教程