[英]How to reshape a 2d numpy.array or Qobj into dims=[[2,2],[2,2]]
下面的 Numpy 示例
我的請求的目標是添加兩個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]
的逆過程並不是使用 reshape 的奇跡,也不是如轉換為數組所示。 但是在 numpy 或 qutip 中是否實現了逆向?
你如何將一個二維數組(例如這里的 4x4)重塑為一個 (2x2)x(2x2) 數組? numpy 的內置函數似乎不喜歡我請求的示例。 它不接受如下所示的列表列表:
import numpy as np
state = np.identity(4).reshape([[2,2],[2,2]])
我很驚訝以前沒有人問過這個問題!
在將此答案應用於 qutip 時,Jojo 的答案是不完整的。
關於 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
解決方案是將正確的形狀 (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 的“解決方法”有效。
您以錯誤的方式使用重塑。 它需要一個維度元組作為參數(參見文檔),而不是一個元組元組或以維度為元素的列表列表 - 這應該如何工作? 我認為您正在將列表列表的深度與維度(預計將是元組的數字條目)混合在一起。
我不確定你到底想要什么,但我猜是以下之一:
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))
您可以直接使用 dims 屬性設置尺寸:
s2 = q.maximally_mixed_dm(4)
s2.dims = [[2,2],[2,2]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.