我有很多2乘2的矩阵,A
,A.shape == (2, 2, 7324)
,我必须计算所有这些矩阵的矩阵指数。不幸的是,scipy.linalg.expm
一次只接受一个矩阵,这样我就必须循环计算,
import numpy
import scipy.linalg
numpy.random.seed(0)
A = numpy.random.rand(2, 2, 7324)
out = numpy.array([scipy.linalg.expm(A[:, :, k]) for k in range(A.shape[-1])])
out = numpy.moveaxis(out, 0, -1)
有没有办法避免这种循环?
- 编辑:* 相应的脚本错误:#12838
3条答案
按热度按时间oknwwptz1#
从SciPy 1.9.0版(发布于2012年7月28日)开始,您可以传递
scipy.linalg.expm
一个最后两维为正方形的数组--即形状为(..., n, n)
的数组--它将以矢量化的方式计算矩阵指数。文档为here。
ki1q1bka2#
浏览代码https://github.com/scipy/scipy/blob/v1.4.1/scipy/sparse/linalg/matfuncs.py#L550-L595,看起来它实际上只假设了一个矩阵。因此,如果你想避免python循环,你需要提取相关的部分,然后自己对它们进行cythonize或numpy-vectorize。只有满足密集矩阵的要求才能让它更容易。
7fhtutme3#
下面是pade近似的代码。这只是针对1个数组,你必须对它进行numpy矢量化/ cythonise。或者只使用numba中的@njit