Учитывая, что у нас есть 3 матрицы Паули , каждая с размерностью (2x2). Как показано ниже:
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)
Теперь, если я помещу эти отдельные (2x2) матрицы как записи в другие (2x2) матрицы. Скажи:
A = np.array([[X, 0], [0, Y]])
B = np.array([[X, X], [Y, Y]])
Странно, у A тусклость (2x2) - что в идеале то, что я хочу - и у B тусклость (2, 2, 2, 2), что бы это ни было, как показано ниже
A = np.array([[X, 0], [0, Y]])
A.shape
Out[131]: (2, 2)
B = np.array([[X, X], [Y, Y]])
B.shape
Out[133]: (2, 2, 2, 2)
С другой стороны, допустим, что C
- матрица (1x3)
, а D
- матрица (1x2)
, например,
C = np.array([[X, Y, 0]])
D = np.array([[X, Y]])
снова, если мы посмотрим на размеры инициализированных матриц
C = np.array([[X, Y, 0]])
C.shape
Out[136]: (1, 3)
D = np.array([[X, Y]])
D.shape
Out[138]: (1, 2, 2, 2)
Так что кажется, что всякий раз, когда я инициализирую массивы в массиве, подобном этому, если есть смешанный тип данных в виде записей, то есть матриц и целых чисел, как в A
и C
, это дает мне разумную форму, которую я хочу, т.е. измерение (2,2)
, с «скрытыми» размерами (2x2)
для каждой записи. Но как только записи являются просто строго матрицами, как в B
и D
, это дает мне незаметное измерение, такое как (2, 2, 2, 2)
. Итак, мой вопрос:
Как я могу инициализировать массив (n, n)
numpy (матрицу) со строго (2, 2)
матрицами в качестве записей, и при этом сохранить его размерность (n, n)
, т.е. вместо того, чтобы давать мне какое-то странное измерение (w, x, y, z)
? 1036 *
Причина, по которой я хочу этого, заключается в том, что я делаю вычисления с операторами в квантовой механике, с этими матрицами Паули, такими как X
, Y
и Z
, в качестве квантовых элементов в квантовых вычислениях. Так что, если у меня есть состояние rho
, которое также является (2x2)
матрицей. Пусть
rho = np.array([[1, 0],
[0, 0]])
И пусть RHO
будет диагональная матрица (2x2)
, а записи - это матрицы (2x2) rho
.
RHO = np.array([[rho, 0],
[0, rho]])
Я хочу вычислить что-то вроде np.dot(D, RHO)
так, чтобы оно давало
np.array([np.dot(X, rho), 0],
[0, np.dot(Y, rho)])
И я проверил на python, что точечные произведения двух (2x2) матриц с (2x2) матрицами в качестве записей, умножения на их записи тоже будут точечными.
Моя мотивация для всего того, о чем я говорил выше, заключается в том, что я надеюсь использовать эти свойства в качестве средства для векторизации моего алгоритма. В настоящее время очень грубый пример моего алгоритма выглядит примерно так:
for i in (integer_1):
for j in (integer_2):
#do something that involves operations with sums of dot products of many matrices#
и векторизовать его так, чтобы он потенциально мог стать
for i in (integer_1):
#do something that involves operations with multiples of matrices with dot product of matrices as its entries#
Что потенциально может работать или нет! Но мне любопытно посмотреть, даст ли мой метод ускорение.
Надеюсь, я хорошо объяснил свои проблемы.
Заранее спасибо.
Edit (1)
Я добавил математику в латексном формате, поэтому, надеюсь, вы поймете, что я пытаюсь сделать.
def compute_channel_operation(rho, operators):
"""
Given a quantum state's density function rho, the effect of the
channel on this state is:
rho -> sum_{i=1}^n E_i * rho * E_i^dagger
Args:
rho (2x2 matrix): Density function
operators (list): List of operators(matrices)
Returns:
number: The result of applying the list of operators
"""
operation = [E@rho@E.conj().T for i, E in enumerate(operators)]
return np.sum(operation, axis=0)
Итак, я надеялся, что вместо использования циклов это прямое умножение тензорного метода может быть быстрее, когда я масштабирую моё моделирование, скажем, нужно сделать это миллион раз
Дело в том, что здесь K должен быть список любых (1xn) измерений, то есть [I] или [I, X] или [I, X, Y] или [I, X, Y, Z]. Я понимаю, что здесь X = X ^ {\ dagger}, как и Y и Z, но в моей симуляции будут ситуации, когда этого не произойдет.
Надеюсь, теперь я все объяснил ясно.