Python Scipy线性构造器数据类型未指定
我正在尝试使用Scipy的Python Scipy线性构造器数据类型未指定,python,numpy,matrix,scipy,Python,Numpy,Matrix,Scipy,我正在尝试使用Scipy的gmres命令。我的矩阵密集且较大,因此我的计划是使用LinearOperator命令仅返回矩阵向量积。请看我前面的问题。在这个问题的帮助下,我能够构建一个LinearOperator对象,它成功地进行了计算a*x,其中a是矩阵,x是向量 问题是当我调用gmres时。我运行命令: x, info = scipy.sparse.linalg.gmres(A, b) 并返回运算符A没有dtype的错误。这是正确的,因为A.dtype返回错误。我的问题是我不知道为dtype
gmres
命令。我的矩阵密集且较大,因此我的计划是使用LinearOperator
命令仅返回矩阵向量积。请看我前面的问题。在这个问题的帮助下,我能够构建一个LinearOperator
对象,它成功地进行了计算a*x
,其中a
是矩阵,x
是向量
问题是当我调用gmres
时。我运行命令:
x, info = scipy.sparse.linalg.gmres(A, b)
并返回运算符A
没有dtype
的错误。这是正确的,因为A.dtype
返回错误。我的问题是我不知道为dtype
指定什么。当我构造线性运算符时,有一个可选参数要传递给dtype
,但我不知道该给它什么。我试图传递
dtype='float64'
,但这冻结了我的IDE,因此我怀疑我在这方面错了。尝试
dtype=None
只会产生默认值,其中没有定义dtype
我还尝试简单地定义A
而将dtype
留空,然后键入A.dtype=None
。这实际上给出了属性A.dtype
,并在调用A
时产生另一个错误
这似乎与另一个问题有关,即gmres似乎希望给它一个先决条件。我实际上没有我想要给它的预调节器,所以它尝试构造一个预调节器,它尝试使用与a相同的数据类型,但是,因为a没有数据类型属性,所以它会出错。如有任何建议,将不胜感激
A = sparse.scipy.linalg.linearoperator(shape = (n,n), matvec = mv, dtype = 'float64')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/isolve/iterative.py", line 393, in gmres
A,M,x,b,postprocess = make_system(A,M,x0,b,xtype)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/isolve/utils.py", line 119, in make_system
M = LinearOperator(A.shape, matvec=psolve, rmatvec=rpsolve, dtype=A.dtype)
AttributeError: LinearOperator instance has no attribute 'dtype'
A=sparse.scipy.linalg.linearoperator(shape=(n,n),matvec=mv,dtype='float64')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/isolve/iterative.py”,第393行,在gmres中
A、 M,x,b,后处理=生成系统(A,M,x0,b,xtype)
文件“/usr/lib/python2.7/dist packages/scipy/sparse/linalg/isolve/utils.py”,第119行,在make_系统中
M=线性构造器(A.shape,matvec=psolve,rmatvec=rpsolve,dtype=A.dtype)
AttributeError:LineRoperator实例没有属性“dtype”
(这与其说是答案,不如说是一个延伸的评论。)
您使用的是什么版本的scipy?我使用的是scipy0.13.0。如果在创建LinearOperator
时未指定数据类型,则会得到您得到的dtype
错误。但是指定dtype='float64'
对我来说很有用:
In [1]: import numpy as np
In [2]: from scipy.sparse.linalg import LinearOperator, gmres
In [3]: def mymatvec(v):
...: a = np.array([[4,2,1],[2,2,1],[1,1,1]])
...: return a.dot(v)
...:
In [4]: A = LinearOperator((3,3), mymatvec, dtype='float64')
In [5]: b = np.array([1,2,3])
In [6]: gmres(A, b)
Out[6]: (array([-0.5, -0.5, 4. ]), 0)
您使用稀疏模块进行密集矩阵运算有什么特别的原因吗?不,我不想,但我只能在稀疏库中找到它。有一个scipy.linalg.gmres,但它似乎要么被弃用,要么没有出现在我的scipy版本中。文档声称它适用于稀疏、密集或线性构造器类型的矩阵。请注意,不需要使用线性构造器,您可以直接将密集矩阵传递给
gmres(a,b)
。我无法直接加载矩阵,因为它占用了太多的计算机RAM。我使用的是Scipy版本0.9.0。不幸的是,我认为我被这个版本卡住了,因为它是我计划运行此代码的计算机上的版本,我没有能力在其上安装新版本。当我添加dtype='float64'并尝试从解释器调用时,我的Python IDE完全冻结。如果有帮助的话,我可以添加代码。有趣的是,当我在Python IDE(Spyder)中运行此代码时,如果我尝试调用,它会冻结,但如果我只是从命令行Python my_file.py执行,它在将其设置为dtype='float64'后会毫无问题地运行。也许现在的问题只是我的IDE。我还没有确认它给了我一个“正确”的结果,但除此之外,你的建议似乎对我有用。谢谢