Python 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

我正在尝试使用Scipy的
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。我还没有确认它给了我一个“正确”的结果,但除此之外,你的建议似乎对我有用。谢谢