Как преобразовать 2d numpy.array или Qobj в dims=[[2,2],[2,2]]
Numpy пример ниже
Цель: объект QuTiP
Цель моего запроса - добавить два объекта квантового состояния типа Qobj
(матрицы плотности), как в следующем примере состояния Вернера (чтобы придать ему некоторый физический смысл).
import qutip as q
r = .5
state = r * q.ket2dm(q.ghz_state(2)) + (1-r) * q.maximally_mixed_dm(4)
Сообщение об ошибке
TypeError: Incompatible quantum object dimensions
Таким образом, можно перейти в состояние более низкого измерения, но затем мы потеряем соответствующие свойства измерения, чтобы перейти к состоянию:
state = r * q.ket2dm(q.ghz_state(2)).data.toarray() + (1-r) * q.maximally_mixed_dm(4)
Мои попытки вроде q.Qobj(q.maximally_mixed_dm(4).data.toarray().reshape([[2,2],[2,2]]))
все не удалось, так как изменение формы не обрабатывает списки списков.
Обратный переход от размеров [[2,2],[2,2]]
до [4,4]
не чудо, использующее изменение формы или как показано преобразованием в массив. Но реализовано ли обратное в numpy или qutip?
Изменить: Для людей, знакомых с NumPy
Как вы преобразуете 2d массив (например, здесь 4x4) в (2x2)x(2x2)? Кажется, встроенная функция numpy не нравится в моем запрошенном примере. Он не принимает списки списков, как показано здесь:
import numpy as np
state = np.identity(4).reshape([[2,2],[2,2]])
Я был удивлен, что никто никогда не задавал этот вопрос раньше!
3 ответа
Вы используете неправильную форму. Он принимает кортеж измерений в качестве аргумента (см. Документы), а не кортеж кортежей или список списков с измерениями в качестве элементов - как это должно работать? Я думаю, что вы смешиваете глубину своего списка списков с размерностью (которые, как ожидается, будут числовыми записями кортежа).
Я не уверен, чем именно вы хотите закончить, но я предполагаю одно из следующего:
state = np.identity(4).reshape((2,2,2,2))
state = np.identity(4).reshape((4,2,2))
state = np.identity(4).reshape((2,2,4))
Ответ Джохо неполон, когда дело доходит до применения этого ответа к подсказке.
Завершить конкретную проблему
Непонятная часть о подсказке заключалась в том, что она требует формы (4,4), но квантовые измерения [[2,2],[2,2]]
, Это приводит к сообщениям об ошибках, например, если форма правильная, квантовые измерения неверны:
>>> import qutip as q
>>> s1 = q.ket2dm(q.ghz_state(2))
>>> s2 = q.maximally_mixed_dm(4).data.toarray().reshape((4,4))
>>> s1+s2
TypeError: Incompatible quantum object dimensions
или если квантовая размерность принята, внутренняя форма неправильна:
>>> import qutip as q
>>> s1 = q.ket2dm(q.ghz_state(2))
>>> s2 = q.maximally_mixed_dm(4).data.toarray().reshape((2,2,2,2))
>>> s1+s2
TypeError: expected dimension <= 2 array or matrix
Контип-специфическая конверсия
Решение состоит в том, чтобы преобразовать правильную форму (4,4) в правильные квантовые измерения [[2,2],[2,2]]
:
s2 = q.Qobj(q.maximally_mixed_dm(4).data.toarray().reshape((4,4)),
dims=[[2,2],[2,2]])
К сожалению, в настоящее время я не вижу такой реализации в qutip, но этот "обходной путь" с помощью numpy работает.
Вы можете установить размеры напрямую с помощью атрибута dims:
s2 = q.maximally_mixed_dm(4)
s2.dims = [[2,2],[2,2]]