如何在两个numpy张量之间进行numpy matmul广播?

时间:2019-07-12 17:22:56

标签: python-3.x numpy numpy-ndarray numpy-broadcasting

我有(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]) 表示逐元素点积

0 个答案:

没有答案