Как преобразовать 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]]
Другие вопросы по тегам