python的@运算符

1. @ 运算符的作用

@ 运算符用于两个数组(或矩阵)之间的矩阵乘法。它的行为类似于数学中的矩阵乘法规则。

数学中的矩阵乘法

假设有两个矩阵 ( A ) 和 ( B ):

  • ( A ) 的形状为 m × n m \times n m×n ( m 行 n 列),

  • ( B ) 的形状为 n × p n \times p n×p ( n 行 p 列),
    则它们的乘积 C = A × B C = A \times B C=A×B 的形状为 m × p m \times p m×p,其中每个元素 C i j C_{ij} Cij的计算公式为:
    C i j = ∑ k = 1 n A i k ⋅ B k j C_{ij} = \sum_{k=1}^n A_{ik} \cdot B_{kj} Cij=k=1nAikBkj

Python 中的 @ 运算符

在 Python 中,@ 运算符可以直接实现上述矩阵乘法。例如:

C = A @ B

这行代码会计算矩阵 A A A B B B 的乘积,并将结果赋值给 C C C

2. @ 的使用条件

使用 @ 运算符时,需要满足以下条件:

  1. 数据类型AB 必须是支持矩阵乘法的数据类型,例如:
    • NumPy 数组(numpy.ndarray),
    • SciPy 稀疏矩阵,
    • PyTorch 或 TensorFlow 的张量等。
  2. 形状匹配:矩阵 A A A 的列数必须等于矩阵 B B B 的行数,否则会报错。

3. @ 的使用示例

以下是一个使用 @ 运算符的简单示例:

示例 1:使用 NumPy 进行矩阵乘法
import numpy as np

# 定义两个矩阵
A = np.array([[1, 2],
              [3, 4]])  # 2x2 矩阵
B = np.array([[5, 6],
              [7, 8]])  # 2x2 矩阵

# 使用 @ 进行矩阵乘法
C = A @ B

print(C)

输出

[[19 22]
 [43 50]]

解释

  • A 和 B 都是 2 × 2 2 \times 2 2×2 矩阵,

  • 计算结果 C 也是 2 × 2 2 \times 2 2×2 矩阵,其值为:
    C = [ 1 ⋅ 5 + 2 ⋅ 7 1 ⋅ 6 + 2 ⋅ 8 3 ⋅ 5 + 4 ⋅ 7 3 ⋅ 6 + 4 ⋅ 8 ] = [ 19 22 43 50 ] C = \begin{bmatrix} 1 \cdot 5 + 2 \cdot 7 & 1 \cdot 6 + 2 \cdot 8 \\ 3 \cdot 5 + 4 \cdot 7 & 3 \cdot 6 + 4 \cdot 8 \end{bmatrix} = \begin{bmatrix} 19 & 22 \\ 43 & 50 \end{bmatrix} C=[15+2735+4716+2836+48]=[19432250]

示例 2:形状不匹配的情况

如果矩阵的形状不匹配,会抛出错误:

A = np.array([[1, 2, 3]])  # 1x3 矩阵
B = np.array([[4], [5]])   # 2x1 矩阵

C = A @ B  # 会报错

错误信息

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?)

解释

  • A 的列数是 3,而 B 的行数是 2,无法进行矩阵乘法。

4. @ 与其他乘法运算符的区别

在 Python 中,还有其他乘法运算符,但它们的行为与 @ 不同:

  1. * 运算符

    • 用于逐元素乘法(Element-wise Multiplication),

    • 要求两个矩阵的形状完全相同。

    • 示例:

      A = np.array([[1, 2], [3, 4]])
      B = np.array([[5, 6], [7, 8]])
      C = A * B  # 逐元素乘法
      

      输出:

      [[ 5 12]
       [21 32]]
      
  2. np.dot() 函数

    • 用于矩阵乘法或向量点积,

    • 功能与 @ 类似,但 @ 更直观。

    • 示例:

      C = np.dot(A, B)  # 等价于 A @ B
      

5. 总结

  • @ 是 Python 中用于矩阵乘法的运算符。
  • 它要求操作数是支持矩阵乘法的数据类型(如 NumPy 数组),并且形状匹配。
  • *(逐元素乘法)和 np.dot()(点积)不同,@ 专门用于矩阵乘法。

你可能感兴趣的:(python,开发语言)