在Python中操作三角形数组,然后在3D中绘图



我已经编写了下面的代码来显示量子行走,它本质上是"硬币投掷"的数字线上的概率分布。函数"get_p(N)"生成一个数组,其中包含N移动后该行上所有可能位置的概率值。

N=10
def get_p(N):
    P = 2*N+1    # number of positions
    # do all your p stuff here
    #defining a quantum coin
    coin0 = array([1, 0])  # |0>
    coin1 = array([0, 1])  # |1>
    #defining the coin operator
    C00 = outer(coin0, coin0)  # |0><0| 
    C01 = outer(coin0, coin1)  # |0><1| 
    C10 = outer(coin1, coin0)  # |1><0| 
    C11 = outer(coin1, coin1)  # |1><1|
    C_hat = (C00 + C01 + C10 - C11)/sqrt(2.)
    #step operator
    ShiftPlus = roll(eye(P), 1, axis=0)
    ShiftMinus = roll(eye(P), -1, axis=0)
    S_hat = kron(ShiftPlus, C00) + kron(ShiftMinus, C11)
    #walk operator
    U = S_hat.dot(kron(eye(P), C_hat))
    #defining the initial state
    posn0 = zeros(P)
    posn0[N] = 1     # array indexing starts from 0, so index N is the central posn
    psi0 = kron(posn0,(coin0+coin1*1j)/sqrt(2.))
    #the state after N steps
    psiN = linalg.matrix_power(U, N).dot(psi0)   
    prob = empty(P)
    for k in range(P):
        posn = zeros(P)
        posn[k] = 1     
        M_hat_k = kron( outer(posn,posn), eye(2))
        proj = M_hat_k.dot(psiN)
        prob[k] = proj.dot(proj.conjugate()).real
    return prob
Z = []
for i in range(N):
    Z.append(get_p(i))
X = arange(2*N+1)
Y = arange(N)

Z本质上是一个三角形数组(如果你想象当N=0时,中间的概率将是1,那么之后可能有3个位置,以此类推)。当N=3时打印Z给出:

[array([ 1.]), array([ 0.5,  0. ,  0.5]), array([ 0.25,  0.  ,  0.5 ,  0.  ,  0.25])]

我的问题是,我如何处理这些,以便绘制它们?这是完成的文章应该看起来像一个图像。

您的Z '数组'实际上是一个不同长度的numpy数组列表。

我认为最好将Z定义为一个事先用零填充的单个数组,然后用您的值填充它。也许像这样:

Z=np.zeros((10,19))
for i in range(N):
    x = coin.get_p(i)
    l = len(x) 
    Z[i,0:l] = x
关于情节,我不清楚你到底想要什么。试着看看下面的例子: http://matplotlib.org/examples/mplot3d/index.html

相关内容

最新更新