numpy教程:numpy中的数值运算,一维到4维都是怎么计算的

在 Numpy 中,数值运算是基于数组的形状和维度来进行的,且有强大的 广播机制(broadcasting)支持不同形状的数组间的操作。这里我们从一维到四维数组的常见数值运算进行详细讲解,逐步理解 Numpy 是如何处理不同维度的数组运算的。

1. 一维数组运算

一维数组是最简单的数组,它就像 Python 中的列表。在一维数组中,数值运算如加法、减法、乘法、除法等是逐元素(element-wise)进行的。

import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

# 一维数组逐元素加法
result = arr1 + arr2
print(result)  # 输出: [5 7 9]

# 一维数组逐元素乘法
result = arr1 * arr2
print(result)  # 输出: [ 4 10 18]
一维数组广播机制:

当数组与标量(比如单个数字)运算时,Numpy 会广播标量到数组的每一个元素进行计算。

arr = np.array([1, 2, 3])

# 每个元素加 5
result = arr + 5
print(result)  # 输出: [6 7 8]

2. 二维数组运算

二维数组可以看作是矩阵,运算同样是逐元素进行的。维度相同的二维数组之间可以直接进行加、减、乘、除等运算。

arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])

# 二维数组逐元素加法
result = arr1 + arr2
print(result)
# 输出:
# [[ 8 10 12]
#  [14 16 18]]

# 二维数组逐元素乘法
result = arr1 * arr2
print(result)
# 输出:
# [[ 7 16 27]
#  [40 55 72]]
广播机制:

广播机制允许不同形状的数组进行运算。Numpy 会通过扩展较小数组的维度来匹配较大数组的维度。

arr = np.array([[1, 2, 3], [4, 5, 6]])
scalar = 10

# 二维数组加标量
result = arr + scalar
print(result)
# 输出:
# [[11 12 13]
#  [14 15 16]]

在广播机制下,标量 10 被扩展为与 arr 形状相同的二维数组,然后逐元素相加。

3. 三维数组运算

三维数组可以看作是二维数组的扩展。操作与一维和二维数组的操作类似,都是逐元素的。

arr1 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
arr2 = np.array([[[1, 1], [1, 1]], [[2, 2], [2, 2]]])

# 三维数组逐元素加法
result = arr1 + arr2
print(result)
# 输出:
# [[[ 2  3]
#   [ 4  5]]
#
#  [[ 7  8]
#   [ 9 10]]]
广播机制:

广播机制同样适用于三维数组。如果数组形状不一致,Numpy 会自动扩展较小的数组使其维度匹配较大的数组。

arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
scalar = 10

# 三维数组加标量
result = arr + scalar
print(result)
# 输出:
# [[[11 12]
#   [13 14]]
#
#  [[15 16]
#   [17 18]]]

4. 四维数组运算

四维数组可以看作是三维数组的进一步扩展。操作方式依然是逐元素运算。

arr1 = np.random.randint(1, 5, (2, 2, 2, 2))
arr2 = np.random.randint(1, 5, (2, 2, 2, 2))

# 四维数组逐元素加法
result = arr1 + arr2
print(result)
广播机制:

同样,广播机制也适用于四维数组。例如,将标量与四维数组相加时,标量会自动扩展为与四维数组匹配的形状。

arr = np.random.randint(1, 5, (2, 2, 2, 2))
scalar = 10

# 四维数组加标量
result = arr + scalar
print(result)

总结:

  • 逐元素运算:Numpy 数组的运算大多是逐元素的,维度相同的数组可以直接进行加减乘除等运算。
  • 广播机制:广播允许形状不匹配的数组进行运算,Numpy 会自动扩展较小数组的维度来匹配较大数组。
  • 维度扩展:从一维到四维数组,运算的本质没有变化,都是逐元素运算,唯一需要注意的是数组形状之间的匹配问题,广播机制会帮助处理这种情况。