У меня есть блочная матрица с ее элементами в виде матриц 2x2 * Массив 1025 *, например
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()
без необходимости l oop через каждый из элементов блочной матрицы (которые сами снова являются матрицами 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)]])
например.