【问题标题】:How to connect two fock basis with their indexes?如何将两个 fock 基与它们的索引连接起来?
【发布时间】: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


【解决方案1】:

你可以定义一个函数:

def samestart(pattern,sequence):
    for i,d in enumerate(pattern):
        if d != sequence[i]:
            return False
    return True

其实你可以改写成:

def samestart(pattern,sequence):
    return all(x == y for x,y in zip(pattern,sequence))

接下来你可以简单地使用列表推导:

[[i for i,sequence in enumerate(basis) if samestart(pattern,sequence)] for patterns in reduced_basi for pattern in patterns]

python 中产生:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def samestart(pattern,sequence):
...     for i,d in enumerate(pattern):
...         if d != sequence[i]:
...             return False
...     return True
... 
>>> 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]]]
>>> [[i for i,sequence in enumerate(basis) if samestart(pattern,sequence)] for patterns in reduced_basi for pattern in patterns]
[[7, 8, 9], [2, 3], [5, 6], [0], [1], [4]]

效率并不差:绝对可以在这里使用散列来提高性能。


如果您可以假设所有“模式”的长度为 2,那么您可以简单地推导出它并构造一个字典。例如:

result = {}
for idx,base in enumerate(basis):
    pattern = tuple(base[0:2])
    patlist = result.get(pattern)
    if patlist is not None:
        patlist.append(idx)
    else:
        result[pattern] = [idx]

这将产生一个字典result

>>> result
{(0, 1): [5, 6], (2, 0): [0], (0, 0): [7, 8, 9], (1, 0): [2, 3], (1, 1): [1], (0, 2): [4]}

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多