Python 中的矩阵求幂

2024-01-01

我正在尝试用 Python 对复杂矩阵求幂,但遇到了一些麻烦。我正在使用scipy.linalg.expm函数,并且当我尝试以下代码时出现相当奇怪的错误消息:

import numpy as np
from scipy import linalg

hamiltonian = np.mat('[1,0,0,0;0,-1,0,0;0,0,-1,0;0,0,0,1]')

# This works
t_list = np.linspace(0,1,10)
unitary = [linalg.expm(-(1j)*t*hamiltonian) for t in t_list]

# This doesn't
t_list = np.linspace(0,10,100)
unitary = [linalg.expm(-(1j)*t*hamiltonian) for t in t_list]

运行第二个实验时的错误是:

This works!
Traceback (most recent call last):
  File "matrix_exp.py", line 11, in <module>
    unitary_t = [linalg.expm(-1*t*(1j)*hamiltonian) for t in t_list]
  File "/usr/lib/python2.7/dist-packages/scipy/linalg/matfuncs.py",     line 105, in expm
    return scipy.sparse.linalg.expm(A)
  File "/usr/lib/python2.7/dist- packages/scipy/sparse/linalg/matfuncs.py", line 344, in expm
    X = _fragment_2_1(X, A, s)
  File "/usr/lib/python2.7/dist-  packages/scipy/sparse/linalg/matfuncs.py", line 462, in _fragment_2_1
    X[k, k] = exp_diag[k]
TypeError: only length-1 arrays can be converted to Python scalars

这看起来真的很奇怪,因为我改变的只是范围t我正在使用。是因为哈密顿量是对角的吗?一般来说,哈密顿量不会,但我也希望它适用于对角线。我真的不知道其中的机制expm,因此任何帮助将不胜感激。


这太有趣了。我可以说的一件事是,这个问题是特定于np.matrix子类。例如,以下工作正常:

h = np.array(hamiltonian)
unitary = [linalg.expm(-(1j)*t*h) for t in t_list]

更深入地研究回溯,异常是在_fragment_2_1 in scipy.sparse.linalg.matfuncs.py, 具体来说这些行 https://github.com/scipy/scipy/blob/81c096001974f0b5efe29ec83b54f725cc681540/scipy/sparse/linalg/matfuncs.py#L748-L755:

n = X.shape[0]
diag_T = T.diagonal().copy()

# Replace diag(X) by exp(2^-s diag(T)).
scale = 2 ** -s
exp_diag = np.exp(scale * diag_T)
for k in range(n):
    X[k, k] = exp_diag[k]

错误信息

    X[k, k] = exp_diag[k]
TypeError: only length-1 arrays can be converted to Python scalars

向我建议exp_diag[k]应该是一个标量,但是返回一个向量(并且你不能将向量分配给X[k, k],这是一个标量)。

设置断点并检查这些变量的形状证实了这一点:

ipdb> l
    751     # Replace diag(X) by exp(2^-s diag(T)).
    752     scale = 2 ** -s
    753     exp_diag = np.exp(scale * diag_T)
    754     for k in range(n):
    755         import ipdb; ipdb.set_trace()  # breakpoint e86ebbd4 //
--> 756         X[k, k] = exp_diag[k]
    757 
    758     for i in range(s-1, -1, -1):
    759         X = X.dot(X)
    760 
    761         # Replace diag(X) by exp(2^-i diag(T)).

ipdb> exp_diag.shape
(1, 4)
ipdb> exp_diag[k].shape
(1, 4)
ipdb> X[k, k].shape
()

根本问题是exp_diag假设为一维向量或列向量,但对角线np.matrix对象是行向量。这突出了一个更普遍的观点:np.matrix通常没有得到很好的支持np.ndarray,所以大多数情况下最好使用后者。

一种可能的解决方案是使用np.ravel()压扁diag_T转化为一维np.ndarray:

diag_T = np.ravel(T.diagonal().copy())

这似乎解决了您遇到的问题,尽管可能还有其他相关问题np.matrix我还没有发现。


我已打开拉取请求here https://github.com/scipy/scipy/pull/5867.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的矩阵求幂 的相关文章

随机推荐

  • 我可以匹配具有相同值形状的所有枚举变体吗?

    我有一个枚举 enum MyEnum A i32 B i32 C D 我可以匹配吗A and B同时与这样的事情 let a MyEnum A 1 match a n gt do something for all variants whi
  • IP地址匹配功能

    我需要找出ip是否属于ip mask 例如 ip 192 168 0 1 掩码 192 168 0 1 24 我找到了将 ip 转换为掩码的函数 inet cidrtoaddr int cidr struct in addr addr in
  • 用 Javascript 求最大质因数

    谢谢阅读 总的来说 对于 Javascript 和编程来说还是很陌生的 我正在寻找一种方法来返回给定数字的最大素因数 我的第一直觉是使用一个 while 循环来计数并找到该数字的质因数 将这些因数存储在数组中并在每次找到一个时重置 这样数组
  • curl: (3) URL 位置 1 中不匹配的大括号:

    我正在从这里运行 Apache Solr 教程 http lucene apache org solr guide 7 6 solr tutorial html http lucene apache org solr guide 7 6 s
  • 如何枚举 Excel 中的重复行?

    我的数据看起来像这样 Monkey Donkey Elephant Panda Donkey Donkey Monkey 我想用数字来区分行 对每个重复项进行计数 Monkey 1 Donkey 1 Elephant 1 Panda 1 D
  • 无法使用数据表和免费编辑器编辑/创建/删除表中的元素

    我正在尝试使用来自 AJAX 调用的 JSON 格式的数据构建一个可编辑表 为此 我将数据表插件与免费数据表编辑器 kingkode com free datatables editor alternative 一起使用 我无法使用数据表编
  • 按下按钮时关闭虚拟键盘

    我有一个Activity与EditText 一个按钮和一个ListView 目的是在搜索屏幕中键入EditText 按下按钮 搜索结果就会填充到此列表中 这一切都工作正常 但虚拟键盘的行为很奇怪 如果我点击EditText 我得到了虚拟键盘
  • 如何读取 WebGL 中的深度缓冲区?

    使用 WebGL API 除了执行我自己的光线投射之外 如何从深度缓冲区获取值 或以任何其他方式从屏幕坐标确定 3D 坐标 即找到单击的位置 几年过去了 这些天WEBGL depth texture扩展广泛可用 除非您需要支持 IE 一般用
  • myspace和linkedin在iphone中的实现

    我想在 iPhone 应用程序中实现 LinkedIn 和 Myspace 我的意思是我想使用我的应用程序更改两者的状态 是否有任何 API 可以同时访问这两者 我尝试了 OAuth API 但它仅适用于 Twitter 谢谢 提前 Lin
  • 了解 TodoMVC 示例

    开始学习node js 和backbone js 并使用TodoMVC 示例作为我的指南 有几个部分我很难理解 见下文 这是app js var express require express http require http mongo
  • 如何使用 python 加载 *.hdr 文件

    我想阅读 hdr 文件格式的环境地图 似乎非常流行的库不支持 hdr 文件读取 例如 OpenCV PIL 等 那么如何将 hdr 文件读取到 numpy 数组中呢 I found ImageIO http imageio github i
  • 是否有相当于“ListView.addHeaderView”的 XML 标记?

    是否有一个 XML 标签可以在布局文件中使用 它相当于ListView addHeaderView http developer android com reference android widget ListView html addH
  • 如何在 ZF2 / ZF3 url 视图助手中添加查询参数

    我正在尝试使用路由创建带有查询字符串的 url 如下所示 this gt url users gt users this gt url users sort gt desc gt users sort desc 然而这似乎不起作用 第二个助
  • Ruby + Windows + 超时 + 串行端口不起作用

    我正在开发一个多平台 Ruby 程序 该程序应该通过 USB 连接到串行设备 首先我使用了serialport gem 1 0 4 但后来我遇到了一些奇怪的问题 不得不放弃它 然后我继续通过Ruby的IO类进行通信 如下所示 port IO
  • 错误:index.js:找不到模块“babel-plugin-r”React Native

    我做了什么导致了错误 我有一个新安装的 Bare React Native Project 我想使用抽屉导航并且必须安装 React Native Reanimated 2 3 0 alpha 2 我已经尝试解决该错误 我已经安装了新的裸反
  • 回归对输入变量之一给出错误“对比只能应用于具有 2 个或更多级别的因素”[重复]

    这个问题在这里已经有答案了 我正在 R 中使用大量输入变量运行 logit 回归 newlogit lt glm install SIZES GROSSCONSUMPTION NETTCONSUMPTION NETTGENERATION G
  • Node.js - 资源解释为脚本,但使用 MIME 类型 text/plain 进行传输

    首先 我没有使用 Express 有了这个 当我加载我的index html递归归档readFile每个附加文件 例如我的 CSS 和 JS 页面 但它总是在我的检查器 Chrome 中返回此错误 资源解释为脚本 但以 MIME 类型 te
  • 将 css-loader 与 Webpack + React 一起使用

    我正在使用 Webpack 和 css loader w modules 构建我的 React 应用程序 我喜欢它 不过 我的大多数样式表都非常小 我想将它们内联到与我的标记和 JavaScript 相同的 JSX 文件中 我现在使用的 C
  • bootstrap.css 和 bootstrap-combined.min.css 有什么区别?

    我正在使用 bootstrap css 我发现还有另一个名为的 css 文件bootstrap combined min css 风格上有什么区别吗 是否需要包含这两个 css 文件 哪一个更可取 文件bootstrap combined
  • Python 中的矩阵求幂

    我正在尝试用 Python 对复杂矩阵求幂 但遇到了一些麻烦 我正在使用scipy linalg expm函数 并且当我尝试以下代码时出现相当奇怪的错误消息 import numpy as np from scipy import lina