Как преобразовать 2d numpy.array или Qobj в dims = [[2,2], [2,2]] - PullRequest
0 голосов
/ 13 сентября 2018

Пример 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

Как изменить форму двумерного массива (например, здесь 4x4) в (2x2)) х (2х2) один?Кажется, встроенная функция numpy не нравится в моем запрошенном примере.Он не принимает списки списков, как показано здесь:

import numpy as np
state = np.identity(4).reshape([[2,2],[2,2]])

Я был удивлен, что никто никогда не задавал этот вопрос раньше!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Ответ Джохо неполон, когда дело касается применения этого ответа к подсказке.

Контип-специфическая проблема

Запутывающая часть о подсказке заключалась в том, что она требует формы (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 работает.

0 голосов
/ 13 сентября 2018

Вы используете неправильную форму. Он принимает кортеж измерений в качестве аргумента (см. Документы), а не кортеж кортежей или список списков с измерениями в качестве элементов - как это должно работать? Я думаю, что вы смешиваете глубину своего списка списков с размерностью (которые, как ожидается, будут числовыми записями кортежа).

Я не уверен, чем именно вы хотите закончить, но я предполагаю одно из следующего:

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))
...