如何解决scipy.linalg.solve的向量化
我有许多较小的矩阵,例如5 x 5,A = numpy.random.rand(5,5,7,77)
,其中的一侧为y = numpy.random.rand(5)
。我想解决所有7 x 77问题A_{ij} x = b
,以使结果x
的形状为5,77
。我可以简单地遍历它们,
from scipy.linalg import solve
import numpy
A = numpy.random.rand(5,77)
b = numpy.random.rand(5)
x = []
for i in range(A.shape[2]):
x.append([])
for j in range(A.shape[3]):
x[-1].append(solve(A[:,:,i,j],b))
x = numpy.array(x)
x = numpy.moveaxis(x,-1,0)
print(x.shape)
但这很慢。感觉应该有可能通过将A
而不是5 x 5 x 7 x 77张量或浮点数,而是作为7 x 77浮点数数组的5 x 5矩阵进行向量化,并执行{这些阵列上的{1}}。有提示吗?
(我经常遇到这类问题,因此,如果有一个图书馆来处理这些问题,我也将很高兴听到它。)
解决方法
如果您首先重新排列尺寸,则可以使用np.linalg.solve
进行操作。
import numpy as np
# Make random problem
np.random.seed(0)
a = np.random.rand(5,5,7,77)
b = np.random.rand(5)
# Put additional axes at the end
at = np.moveaxis(a,(0,1),(2,3))
# Solve
xt = np.linalg.solve(at,b[np.newaxis,np.newaxis])
# Put axes back in place
x = np.moveaxis(xt,2,0)
print(x.shape)
# (5,77)
# Test some result
print(np.allclose(a[:,:,4,36] @ x[:,36],b))
# True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。