Numpy 数组广播规则

Numpy 数组广播规则

在使用Numpy进行数组计算时,通常会遇到不同形状的数组进行运算或者操作。Numpy提供了一种非常方便的解决方法,即数组广播(broadcasting)。本文将介绍Numpy数组广播规则及其应用。

阅读更多:Numpy 教程

什么是数组广播

数组广播是一种在Numpy中,用于处理形状不同的数组进行算术运算的方式。Numpy会自动适应数组的形状,进行element-wise的运算。例如:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = a + b

print(c)

输出结果为

[5 7 9]

这就是数组广播的实现,Numpy自动将两个形状不同的数组,适应成为相同的形状再计算。

广播的规则

Numpy数组广播的规则如下:

  1. 如果两个数组的维数不同,那么维数较少的数组在其前面补1,直到维数一致。
  2. 如果两个数组在某个维度上的长度是相同的,或者其中一个数组在该维度拥有长度为1,那么我们就可以说这两个数组在该维度上是兼容的。
  3. 如果两个数组在所有维度上都是兼容的,那么它们就能使用广播。
  4. 根据广播的规则,输出数组的形状是输入数组形状的各个维度上的最大值。
  5. 如果输入数组的某个维度大小为1,那么在对该维度进行运算时,就好像是在沿着该维度对该单元素进行运算。

理解了数组广播的规则,我们来看几个例子

不同维度长度的广播

import numpy as np

a = np.array([1, 2, 3])
b = 2
c = a + b

print(c)

输出结果为

[3 4 5]

在这里,我们使用了函数np.array()将整数2转化为了一个形状为(1,)的一维数组。然后,根据广播规则第一条,由于数组a的维数是1,我们就在其前面补了1,变成了形状为(1, 3)的二维数组;同时,数组b的维数也是1,也就变成了形状为(1, 1)的二维数组。最终,两个数组在第一维都有1个元素,第二维分别是3和1个元素,于是它们是兼容的,Numpy进行element-wise的运算后得到了正确的结果。

一个维度长度为1的广播

import numpy as np

a = np.array([[1], [2], [3]])
b = np.array([4, 5, 6])
c = a + b

print(c)

输出结果为

[[5 6 7]
 [6 7 8]
 [7 8 9]]

在这个例子中,我们有一个形状为(3, 1)的二维数组a和一个形状为(1, 3)的二维数组b。它们都只有一个维度的长度是1,于是它们在这个维度上是兼容的。根据广播规则第四条,输出数组的形状为(3, 3),即输入数组的形状的各个维度上的最大值。Numpy自动将两个数组广播成相同的形状,进行element-wise的运算。

实际应用

数组广播在我们日常使用Numpy进行数据计算的过程中,是非常方便的。它可以大大简化代码的编写和运行过程,提高程序的效率。下面通过一些例子来介绍其在实际应用中的使用。

广播与矩阵乘法

矩阵乘法是Numpy中常用的计算方式。但是需要满足矩阵乘法的规则,即矩阵A的列数等于矩阵B的行数。如果这个条件不满足,就需要使用数组广播。例如:

import numpy as np

a = np.array([1, 2, 3])  # 形状为(3,)
b = np.array([[1], [2], [3]])  # 形状为(3, 1)

c = np.dot(a, b)

print(c)

输出结果为

[[14]]

Numpy进行了数组广播,正确地求解了矩阵乘法的结果。

广播与axis参数

在进行数组广播运算时,可以使用axis参数指定运算的轴。例如:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])  # 形状为(2, 3)
b = np.array([1, 2, 3])  # 形状为(3,)

c = np.sum(a * b, axis=1)

print(c)

输出结果为

[14 32]

在这个例子中,我们使用了*操作符进行广播运算,相当于每一行都乘以了形状为(3,)的一维数组b,并且将乘积再在第二个维度上求和。

广播与复杂计算

在实际应用中,经常需要进行一些复杂的数组广播计算。例如:

import numpy as np

a = np.array([[-1.0, 2.0], [3.0, 4.0]])
b = np.array([1.0, 2.0])

c = a * b[:, np.newaxis]

print(c)

输出结果为

[[-1.  2.]
 [ 6.  8.]]

在这个例子中,我们使用了[:, np.newaxis]来扩展形状为(2,)的一维数组b,使得它变成了一个形状为(2, 1)的二维数组。然后,我们利用数组广播,对形状为(2, 2)的数组a和形状为(2, 1)的数组b进行element-wise乘法运算。

总结

本文介绍了Numpy数组广播规则及其应用。数组广播是一种非常方便的计算方式,可以大大简化代码的编写和运行过程,提高程序的效率。在实际应用中,经常需要使用数组广播进行复杂的计算,需要熟练掌握广播的规则和应用方法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程