如何将2d numpy.array或Qobj重塑为dims = [[2,2],[2,2]]

问题描述 投票:0回答:2

下面的Numpy例子


目标:QuTiP对象

我的请求的目标是添加两个类型为Qobj(密度矩阵)的量子状态对象,如下面的Werner状态示例(给它一些物理意义)。

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

我很惊讶以前从来没有人问过这个问题!

python reshape qutip
2个回答
1
投票

你正在以错误的方式重塑形状。它需要维度的元组作为参数(参见文档)而不是元组的元组或具有维度作为元素的列表列表 - 应该如何工作?我认为你将列表列表的深度与维度(预期是元组的数字条目)混合在一起。

我不确定你到底想要什么,但我想其中一个:

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

0
投票

当将这个答案应用于qutip时,Jojo的答案是不完整的。

Qutip具体问题

关于qutip的令人困惑的部分是它需要(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

Qutip特定转换

解决方案是将正确的形状(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工作。

© www.soinside.com 2019 - 2024. All rights reserved.