操作三角形阵列,然后在Python中绘制3D图形

时间:2014-03-29 03:05:27

标签: python arrays numpy matplotlib 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])]

所以我的问题是如何操纵这些以便我可以绘制它们? This是完成文章应该是什么样子的图像。

1 个答案:

答案 0 :(得分:0)

您的Z&#39;阵列&#39;实际上是一个不同长度的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