我有(2x2)和复杂的Pauli矩阵
II = np.identity(2, dtype=complex)
X = np.array([[0, 1], [1, 0]], dtype=complex)
Y = np.array([[0, -1j], [1j, 0]], dtype=complex)
Z = np.array([[1, 0], [0, -1]], dtype=complex)
和一个depolarizing_error
函数,该函数采用由param
生成的正态分布随机数np.random.normal(noise_mean, noise_sd)
def depolarizing_error(param):
XYZ = np.sqrt(param/3)*np.array([X, Y, Z])
return np.array([np.sqrt(1-param)*II, XYZ[0], XYZ[1], XYZ[2]])
现在,如果我输入param
的{{1}}的单个数字,则我的函数应该返回a
的输出,其中np.array([np.sqrt(1-a)*II, a*X, a*Y, a*Z])
是{{1} }和a
表示float
与(2x2)矩阵*
的条目之间的逐元素乘法。
现在出于矢量化的目的,我希望输入a
的数组,即
II, X, Y, Z
再次由param
独立生成的所有param = np.array([a, b, c, ..., n]) Eqn(1)
(我认为这对a, b, c, ..., n
是可行的)
这样我的函数现在返回:
np.random.normal(noise_mean, noise_sd)
我认为以np.random.normal(noise_mean, noise_sd, n)
的形式输入np.array([[np.sqrt(1-a)*II, a*X, a*Y, a*Z],
[np.sqrt(1-b)*II, b*X, b*Y, b*Z],
................................,
[np.sqrt(1-n)*II, n*X, n*Y, n*Z]])
,以np.random.normal(noise_mean, noise_sd, n)
的形式输出将解决问题并返回我想要的内容。但是我的param
最终做了逐个元素的乘积运算,而不是逐个元素的乘法运算。我尝试将param用作np.array([a, b, c,...,n])
并以
XYZ = np.sqrt(param/3)*np.array([X, Y, Z])
相反。到目前为止,我已经尝试过类似
np.array([a, b])
认为matmul @会为我方便地广播它,但后来我真的对尺寸感到困惑。
现在,我想做所有这些事情的动机是因为我还有另一个矩阵,该矩阵是:
np.array([np.dot(np.sqrt(1-[a, b]), II),
np.dot(np.sqrt([a, b]/3), X),
np.dot(np.sqrt([a, b]/3), Y),
np.dot(np.sqrt([a, b]/3), Z)])
此处def depolarizing_error(param):
XYZ = np.sqrt(param/3)@np.array([X, Y, Z])
return np.array([np.sqrt(1-param)*II, XYZ[0], XYZ[1], XYZ[2]])
的大小等于等式(1)def random_angles(sd, seq_length):
return np.random.normal(0, sd, (seq_length,3))
def unitary_error(params):
e_1 = np.exp(-1j*(params[:,0]+params[:,2])/2)*np.cos(params[:,1]/2)
e_2 = np.exp(-1j*(params[:,0]-params[:,2])/2)*np.sin(params[:,1]/2)
return np.array([[e_1, e_2], [-e_2.conj(), e_1.conj()]],
dtype=complex).transpose(2,0,1)
中的条目数,表示seq_length
。在这里,我的param
函数应该给我输出
N = seq_length = |param|
这样我就可以使用unitary_error
来实现这样的矢量化
np.array([V_1, V_2, ..., V_N])
最终给予
np.matmul
这里np.array([V_1, V_2, ..., V_N])@np.array([[np.sqrt(1-a)*II, a*X, a*Y, a*Z],
[np.sqrt(1-b)*II, b*X, b*Y, b*Z],
................................,
[np.sqrt(1-n)*II, n*X, n*Y, n*Z]])@np.array([V_1, V_2, ..., V_N])
表示逐元素点积