【发布时间】:2020-03-01 15:57:13
【问题描述】:
我有一个块矩阵,其元素为 2x2 矩阵 numpy 数组,例如
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)
block_matrix = np.array([X,Y,Z])
我正在寻找一种矢量化方式(如果存在),我可以在其中计算 np.kron() 而不必遍历块矩阵的每个元素(它们本身又是 2x2 矩阵)。现在我有类似的东西
def pl_rep_operation(matrix):
op_sum = np.zeros((4,4), dtype=complex)
tensored_seq = []
for i in range(len(matrix)):
tensored = np.kron(matrix[i], matrix[i].conj())
op_sum += tensored
tensored_seq.append(tensored)
return op_sum, tensored_seq
其中tensored_seq 返回原始序列及其块矩阵元素张量,op_sum 返回所有张量矩阵元素的元素总和。例如输出可以是
op_sum, tensored_seq = pl_rep_operation(np.array([X,Y,Z]))
In[47]: op_sum
Out[47]:
array([[ 1.+0.j, 0.+0.j, 0.+0.j, 2.+0.j],
[ 0.+0.j, -1.+0.j, 0.+0.j, 0.+0.j],
[ 0.+0.j, 0.+0.j, -1.+0.j, 0.+0.j],
[ 2.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]])
In[48]: tensored_seq
Out[48]:
[array([[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]]),
array([[ 0.+0.j, -0.+0.j, -0.+0.j, 1.+0.j],
[ 0.+0.j, 0.+0.j, -1.+0.j, -0.+0.j],
[ 0.+0.j, -1.+0.j, 0.+0.j, -0.+0.j],
[ 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]]),
array([[ 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[ 0.+0.j, -1.-0.j, 0.+0.j, 0.-0.j],
[ 0.+0.j, 0.+0.j, -1.+0.j, 0.+0.j],
[ 0.+0.j, 0.-0.j, 0.+0.j, 1.+0.j]])]
tensored_seq 的元素应该类似于np.array([np.kron(X,X), np.kron(Y,Y), np.kron(Z,Z)])。我正在寻找一些函数np.func() 或某种方式来矢量化它,以便np.func(block_matrix, block_matrix) 将返回np.array([np.kron(X,X), np.kron(Y,Y), np.kron(Z,Z)])。理想情况下,我想要一种矢量化的方式,它也可以
block_mat = np.array([[X, Y, Z], [X, Z, Y], [Z, Y, X]])
np.func(block_mat)
应该返回
np.array([[np.kron(X,X), np.kron(Y,Y), np.kron(Z,Z)],
[np.kron(X,X), np.kron(Z,Z), np.kron(Y,Y)],
[np.kron(Z,Z), np.kron(Y,Y), np.kron(X,X)]])
例如。
【问题讨论】:
-
np.kron在它的“矢量化”中也不例外,我刚刚在最近的一个回答中证明它做了一个outer,然后是元素重新排列(重塑和转置) -
如果
X是 (2,2),那么block_matrix是 (3,2,2)。第二个版本是 (3,3,2,2),你的伪 kron 扩展为 (3,3,4,4)。由于您没有做kron(X,Z)之类的事情,我认为最直接的方法是只计算 3 克朗,然后从中组装目标。这对于基本的numpy代码来说过于专业化了。