【发布时间】:2017-06-06 13:05:06
【问题描述】:
我为具有给定数量的粒子N 和站点Mtot 的bosson 生成Fock 基(量子力学),它只是构建了一组列表,其中包含Mtot 必须用N 覆盖的位置项目(见下面的代码)。然后我用M 站点(Mtot = 2*M)和所有可能的粒子/项目 n = 0,1,2...N 构建另一个列表列表。 (在我的代码中,为了简单起见,我为 N=2,M=2 工作)
import numpy as np
from scipy.special import binom
M = 2
Mtot = 2*M
N = 2
def generate(N,nb):
states = np.zeros((int(binom(nb+N-1, nb)), N), dtype=int)
states[0, 0]=nb
ni = 0 # init
for i in xrange(1, states.shape[0]):
states[i,:N-1] = states[i-1, :N-1]
states[i,ni] -= 1
states[i,ni+1] += 1+states[i-1, N-1]
if ni >= N-2:
if np.any(states[i, :N-1]):
ni = np.nonzero(states[i, :N-1])[0][-1]
else:
ni += 1
return states.tolist()
basis = generate(Mtot,N)
reduced_basi = []
for i in xrange(N+1):
reduced_basi.append(generate(M,i))
现在,重点是我想获得一个列表,其中包含reduced_basi 中可能的状态的索引,可以连接到basis 中的其他状态。例如,使用前面的代码,我们将获得:
basis = [[2, 0, 0, 0], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1], [0, 2, 0, 0], [0, 1, 1, 0], [0, 1, 0, 1], [0, 0, 2, 0], [0, 0, 1, 1], [0, 0, 0, 2]]
reduced_basi = [[[0, 0]], [[1, 0], [0, 1]], [[2, 0], [1, 1], [0, 2]]]
所以reduced_basi的第一项[0, 0]可以与[0, 0, 2, 0]、[0, 0, 1, 1]和[0, 0, 0, 2]相关,那么[1,0]可以与[1, 0, 1, 0], [1, 0, 0, 1]相关...所以也就是说,我要构建的列表必须作为第一个组件:index_list[0] = [7,8,9](其中 7,8,9 是 basis 状态的相应索引,遵循相同的顺序)和第二个:index_list[1] = [2,3]。最后,它必须系统地完成,因此我必须为这种特殊情况获得以下列表(我已经手动计算了):
index_list = [[7,8,9],[2,3],[5,6],[0],[1],[4]]
知道如何实现吗?
【问题讨论】:
-
所以你基本上想要共享相同起始序列的索引?
-
是的,正是这个
-
为什么
reduce_basi是分层打包的?你想维护它吗? -
嗯嗯,其实是不需要分层打包的。这样,它就可以被分解了
标签: python numpy indexing scipy