在 NumPy 中,@ 符号表示矩阵乘法(也称为点积运算),遵循线性代数中的矩阵乘法规则。当二维数组与一维数组使用 @ 相乘时,会根据它们的形状触发不同的计算逻辑:
核心规则
- 
二维数组(形状为(m, n))与一维数组(形状为(n,))相乘时:- 一维数组会被视为列向量(形状为 (n, 1))
- 结果为一个一维数组(形状为 (m,)),即矩阵与列向量的乘积
 
- 一维数组会被视为列向量(形状为 
- 
若一维数组形状为(m,),需先将其视为行向量(形状为(1, m)),才能与(m, n)的二维数组相乘,结果为形状(1, n)的数组(可通过.flatten()转为一维)
示例代码
import numpy as np# 创建一个 2×3 的二维数组(矩阵)
arr_2d = np.array([[1, 2, 3],[4, 5, 6]])  # 形状:(2, 3)# 1. 一维数组长度与二维数组的列数相同(3)
vec_col = np.array([10, 20, 30])  # 形状:(3,),视为列向量 (3,1)
result1 = arr_2d @ vec_col
print("情况1:二维数组 @ 列向量(长度=列数)")
print(f"结果形状:{result1.shape}")  # 输出:(2,)
print(f"结果值:{result1}")          # 输出:[140 320]
# 计算逻辑:
# 第一行:1×10 + 2×20 + 3×30 = 140
# 第二行:4×10 + 5×20 + 6×30 = 320# 2. 一维数组长度与二维数组的行数相同(2)
vec_row = np.array([10, 20])  # 形状:(2,),需视为行向量 (1,2)
# 先将一维数组转为行向量(通过 reshape(1, 2))
result2 = vec_row.reshape(1, 2) @ arr_2d
print("\n情况2:行向量 @ 二维数组(长度=行数)")
print(f"结果形状:{result2.shape}")  # 输出:(1, 3)
print(f"结果值:{result2}")          # 输出:[[90 120 150]]
print(f"转为一维:{result2.flatten()}")  # 输出:[90 120 150]
# 计算逻辑:
# 第一列:10×1 + 20×4 = 90
# 第二列:10×2 + 20×5 = 120
# 第三列:10×3 + 20×6 = 150
关键区别
- *运算符:执行对应元素相乘(依赖广播机制)
- @运算符:执行矩阵乘法(遵循线性代数的点积规则)
使用时需根据具体需求选择:元素级运算用 
*,线性代数中的矩阵 - 向量乘法用 @。