如何在 NumPy 加法中处理不同形状的数组

PythonBeginner
立即练习

简介

在本教程中,我们将探讨如何在强大的Python库NumPy中执行加法运算时处理不同形状的数组。无论你使用的是一维、二维还是更高维的数组,你都将学习到确保准确且高效的数组操作的技巧。

NumPy 数组简介

NumPy 是一个强大的用于 Python 科学计算的开源库。它支持大型多维数组和矩阵,并提供大量高级数学函数来对这些数组进行操作。NumPy 数组是许多科学计算和机器学习任务中使用的基本数据结构。

什么是 NumPy 数组?

NumPy 数组是一个值的网格,所有值的类型相同,并由正整数元组索引。维度的数量是数组的秩,数组的形状是一个整数元组,表示数组在每个维度上的大小。

import numpy as np

## 创建一个一维数组
arr1d = np.array([1, 2, 3, 4, 5])
print(arr1d)
## 输出: [1 2 3 4 5]

## 创建一个二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d)
## 输出: [[1 2 3]
##          [4 5 6]]

使用 NumPy 数组的好处

  1. 高效的数据存储:NumPy 数组将数据存储在连续的内存块中,与 Python 列表相比,这使得它们在内存使用上更高效。
  2. 快速计算:NumPy 为处理数组提供了高度优化的函数和操作,这些函数和操作是用 C 和 Fortran 等低级语言实现的,因此比纯 Python 代码快得多。
  3. 通用性:NumPy 数组可以有任意数量的维度,并且支持广泛的数学运算,使其适用于各种科学和数据分析任务。
  4. 与其他库的集成:NumPy 在 Python 科学计算生态系统中被广泛用作基础库,并且与 Pandas、SciPy 和 Matplotlib 等其他流行库集成良好。

理解数组形状

NumPy 数组的形状指的是沿每个维度的元素数量。它由一个正整数元组表示,该元组指定了数组沿每个轴的大小。

访问数组形状

你可以使用 shape 属性来访问 NumPy 数组的形状:

import numpy as np

## 一维数组
arr1d = np.array([1, 2, 3, 4, 5])
print(arr1d.shape)  ## 输出: (5,)

## 二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d.shape)  ## 输出: (2, 3)

## 三维数组
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3d.shape)  ## 输出: (2, 2, 2)

重塑数组

你可以使用 reshape() 方法来重塑 NumPy 数组。新的形状必须与数组的原始大小兼容。

import numpy as np

## 将一维数组重塑为二维数组
arr1d = np.array([1, 2, 3, 4, 5, 6])
arr2d = arr1d.reshape(2, 3)
print(arr2d)
## 输出: [[1 2 3]
##          [4 5 6]]

## 将二维数组重塑为三维数组
arr2d = np.array([[1, 2], [3, 4], [5, 6]])
arr3d = arr2d.reshape(3, 1, 2)
print(arr3d)
## 输出: [[[1 2]]
##          [[3 4]]
##          [[5 6]]]

广播

NumPy 还支持广播,这允许你对不同形状的数组执行操作。当形状不兼容时,NumPy 会自动重塑较小的数组以匹配较大数组的形状。

import numpy as np

## 用一维数组对二维数组进行广播
arr1d = np.array([1, 2, 3])
arr2d = np.array([[4, 5, 6], [7, 8, 9]])
result = arr1d + arr2d
print(result)
## 输出: [[ 5  7  9]
##          [ 8 10 12]]

对不同形状的数组执行加法运算

当对两个 NumPy 数组进行加法运算时,数组的形状必须兼容。这意味着数组必须具有相同的形状,或者至少有一个维度的大小为 1(单例维度),以便它可以广播到另一个数组的形状。

对形状相同的数组进行加法运算

如果数组具有相同的形状,你可以简单地使用 + 运算符来执行按元素加法:

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
result = arr1 + arr2
print(result)
## 输出: [[ 6  8]
##          [10 12]]

对形状不同的数组进行加法运算(广播)

如果数组具有不同的形状,NumPy 将在执行加法之前尝试将数组广播到一个共同的形状。广播是一项强大的功能,它允许你对不同形状的数组执行操作。

import numpy as np

## 用一维数组对二维数组进行广播
arr1d = np.array([1, 2, 3])
arr2d = np.array([[4, 5, 6], [7, 8, 9]])
result = arr1d + arr2d
print(result)
## 输出: [[ 5  7  9]
##          [ 8 10 12]]

## 用标量对二维数组进行广播
scalar = 10
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
result = scalar + arr2d
print(result)
## 输出: [[11 12 13]
##          [14 15 16]]

在上面的示例中,NumPy 自动广播一维数组和标量以匹配二维数组的形状,从而允许执行加法运算。

处理不兼容的形状

如果数组的形状无法广播到一个共同的形状,NumPy 将引发 ValueError 异常:

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6, 7], [8, 9, 10]])
result = arr1 + arr2
## ValueError: operands could not be broadcast together with shapes (2,2) (2,3)

在这种情况下,你可能需要在执行加法之前对其中一个或两个数组进行重塑或转置,以使它们的形状兼容。

总结

在本教程结束时,你将对如何在 NumPy 中执行加法运算时处理不同形状的数组有扎实的理解。你将具备编写健壮且灵活的 Python 代码的知识,这些代码能够无缝处理各种数组配置,使你有能力应对更复杂的数据分析和科学计算任务。