numpy 中二维数据 乘以(@) 一维数组。

 

在 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
 

关键区别

  • * 运算符:执行对应元素相乘(依赖广播机制)
  • @ 运算符:执行矩阵乘法(遵循线性代数的点积规则)
 
使用时需根据具体需求选择:元素级运算用 *,线性代数中的矩阵 - 向量乘法用 @

 

posted @ 2025-10-31 13:08  emanlee  阅读(49)  评论(0)    收藏  举报