如何创建可按值与索引调用的Fock态向量字典/列表
生成Fock态向量列表的问题
我需要创建名为Fock_states的字典或列表,存储不同的Fock态向量。这些向量由索引j(对应频率数组ω = np.array([ω₀, ω₁, ω₂])中的ω_j)和Fock数n(对应频率模式的光子数)确定,例如np.array([2,0,0])代表“频率模式ω₀中有2个光子”的Fock态。目标是能通过索引调用对应Fock_state_nj对象,获取指定模式和光子数的态向量。
第一次尝试的代码及问题
Fock_states = [] ω = np.array([0, 2.5, 5]) ψ = np.zeros(len(ω)) def update_ψ(J,N): ψ[J] += N n_max = 10 for j in range(0, len(ω)): for n in range(1, n_max+1): update_ψ(j,n) Fock_states.append(ψ)
这段代码的问题在于始终修改同一个ψ数组对象,所有添加到Fock_states的元素都指向同一个内存地址。循环结束后,ψ被累加为[55,55,55],因此列表中所有元素都是这个值。
第二次尝试的代码及问题
Fock_states = [] ω = np.array([0, 2.5, 5]) ψ = np.zeros(len(ω)) def update_ψ(J,N): ψ[J] += N n_max = 10 for j in range(0, len(ω)): for n in range(1, n_max+1): update_ψ(j,n) Fock_states.append(ψ) update_ψ(j,-n)
这次尝试通过加减抵消数值,但本质还是操作同一个ψ数组。每次添加后又把对应位置的数值减回0,最终列表中所有元素都是全0数组,且依然是同一个对象的引用。
解决方案
方案1:使用列表存储独立向量
每次循环创建新的零数组,修改对应位置后添加到列表,确保每个元素都是独立的对象:
import numpy as np ω = np.array([0, 2.5, 5]) Fock_states = [] n_max = 10 for j in range(len(ω)): for n in range(1, n_max + 1): # 每次生成新的零向量 ψ = np.zeros(len(ω)) ψ[j] = n Fock_states.append(ψ)
方案2:使用字典直接映射(n,j)到态向量
如果需要更直观地通过n和j调用向量,用字典存储更方便:
import numpy as np ω = np.array([0, 2.5, 5]) Fock_states_dict = {} n_max = 10 for j in range(len(ω)): for n in range(1, n_max + 1): ψ = np.zeros(len(ω)) ψ[j] = n # 用(n,j)作为键,直接通过Fock_states_dict[(n,j)]调用 Fock_states_dict[(n, j)] = ψ # 也可以用自定义字符串键:Fock_states_dict[f"Fock_state_{n}{j}"] = ψ
内容的提问来源于stack exchange,提问作者Cody Payne
相关产品推荐
相关产品推荐

