我已经编写了下面的代码来展示量子行走,这实际上是一个数字线上的概率分布,用于"硬币翻转"。函数" 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是完成文章应该是什么样子的图像。
答案 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
关于情节,我不清楚你到底想要什么。试着看看这里的例子: