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

时间:2018-09-13 15:28:01

标签: python reshape qutip

下面的脾气暴躁的例子


目标: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]])

令我惊讶的是,以前没有人问过这个问题!

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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进行工作的“解决方法”。

答案 2 :(得分:0)

您可以直接使用 dims 属性设置尺寸:

s2 = q.maximally_mixed_dm(4)
s2.dims = [[2,2],[2,2]]