Python中标量向量与泡利矩阵向量的点积运算实现问题
实现标量向量与泡利矩阵向量点积的方案
你需要实现的运算本质是对应分量相乘后求和,即 d·σ = a*σₓ + b*σᵧ + c*σ_z,最终输出为一个2×2的复数矩阵,以下是两种可行的实现方式:
方案1:使用np.einsum(推荐,逻辑直观无需修改原数组结构)
einsum可以自由指定张量的运算维度,完美适配该场景。当d为形状(3,)的标量数组、sigma为形状(3,2,2)的泡利矩阵数组时,直接指定对第一个维度求和即可:
result = np.einsum('i,ijk->jk', d, sigma)
方案2:使用广播机制+求和
给d增加两个维度适配sigma的后两维,广播相乘后对第一个维度求和:
result = (d[:, np.newaxis, np.newaxis] * sigma).sum(axis=0)
可运行验证示例
import numpy as np # 定义泡利矩阵 sigma_x = np.array([[0, 1], [1, 0]], dtype=complex) sigma_y = np.array([[0, -1j], [1j, 0]], dtype=complex) sigma_z = np.array([[1, 0], [0, -1]], dtype=complex) # 示例标量向量d d = np.array([1+2j, 3, 4j]) sigma = np.array([sigma_x, sigma_y, sigma_z]) # 两种方案验证 res_einsum = np.einsum('i,ijk->jk', d, sigma) res_broadcast = (d[:, np.newaxis, np.newaxis] * sigma).sum(axis=0) res_manual = d[0]*sigma_x + d[1]*sigma_y + d[2]*sigma_z print(np.allclose(res_einsum, res_manual)) # 输出 True print(np.allclose(res_broadcast, res_manual)) # 输出 True
常见错误说明
你之前使用dot/matmul未得到预期结果,是因为这两个函数默认的维度匹配规则不适配当前“对第一个维度加权求和”的需求;而你将d修改为每个元素乘单位矩阵后,若要得到正确结果可以用np.einsum('ijk,ikl->jl', d, sigma)实现,但属于冗余操作,无需修改原d的结构即可完成运算。
内容的提问来源于stack exchange,提问作者Leviathan
相关产品推荐
相关产品推荐

