Numpy 广播

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 中重要的功能之一,它可以帮助我们处理不同形状的数据,做到快速且便捷的运算。掌握广播的规则和应用,将会对我们的数据处理和分析带来很大的帮助。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程