如何将 2d numpy.array 或 Qobj 重塑为 dims=[[2,2],[2,2]]
How to reshape a 2d numpy.array or Qobj into dims=[[2,2],[2,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]]))
这样的尝试都失败了,因为 reshape 不处理列表的列表。
从维度 [[2,2],[2,2]]
下降到 [4,4]
的逆运算并不是使用重塑或转换为数组所示的奇迹。
但是在 numpy 和 qutip 中是否实现了逆?
编辑:对于熟悉 numpy 的人
如何将二维数组(例如这里的 4x4)重塑为 (2x2)x(2x2) 数组?
numpy 的内置函数似乎不喜欢我请求的示例。
它不接受列表列表,如下所示:
import numpy as np
state = np.identity(4).reshape([[2,2],[2,2]])
我很惊讶以前从来没有人问过这个问题!
您以错误的方式使用了重塑。它以维度的元组作为参数(参见文档),而不是元组的元组或以维度作为元素的列表列表——这应该如何工作?我认为您将列表列表的深度与维度(预计是元组的数字条目)混合在一起。
我不确定你到底想得到什么,但我猜是以下之一:
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))
Jojo 在将此答案应用于 qutip 时的回答不完整。
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 中没有看到这样的实现,但是这个 "workaround" 通过 numpy 工作。
您可以直接使用 dims 属性设置尺寸:
s2 = q.maximally_mixed_dm(4)
s2.dims = [[2,2],[2,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]]))
这样的尝试都失败了,因为 reshape 不处理列表的列表。
从维度 [[2,2],[2,2]]
下降到 [4,4]
的逆运算并不是使用重塑或转换为数组所示的奇迹。
但是在 numpy 和 qutip 中是否实现了逆?
编辑:对于熟悉 numpy 的人
如何将二维数组(例如这里的 4x4)重塑为 (2x2)x(2x2) 数组? numpy 的内置函数似乎不喜欢我请求的示例。 它不接受列表列表,如下所示:
import numpy as np
state = np.identity(4).reshape([[2,2],[2,2]])
我很惊讶以前从来没有人问过这个问题!
您以错误的方式使用了重塑。它以维度的元组作为参数(参见文档),而不是元组的元组或以维度作为元素的列表列表——这应该如何工作?我认为您将列表列表的深度与维度(预计是元组的数字条目)混合在一起。
我不确定你到底想得到什么,但我猜是以下之一:
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))
Jojo 在将此答案应用于 qutip 时的回答不完整。
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 中没有看到这样的实现,但是这个 "workaround" 通过 numpy 工作。
您可以直接使用 dims 属性设置尺寸:
s2 = q.maximally_mixed_dm(4)
s2.dims = [[2,2],[2,2]]