我想使用Python读取.mtx文件。.mtx文件由Abaqus生成,看起来像这样:
1,1, 1,1, 1.939258533333333e-02
1,2, 1,2, 1.939258533333333e-02
2,1, 2,1, 1.889629366666666e-02
看起来scipy.io.mmread可以工作,但是当我运行以下代码时:
import scipy.io
with open(abs_file_path) as mass_file:
otpt = scipy.io.mmread(mass_file)
我得到以下错误:
Traceback (most recent call last):
File "./test_read_mass_mtx.py", line 12, in <module>
read_mass(file_path)
File "/home/user/Desktop/Temp/python/data_functions/read_mass_mtx.py", line 6, in read_mass
otpt = scipy.io.mmread(mass_file)
File "/home/user/anaconda3/lib/python3.6/site-packages/scipy/io/mmio.py", line 76, in mmread
return MMFile().read(source)
File "/home/user/anaconda3/lib/python3.6/site-packages/scipy/io/mmio.py", line 414, in read
self._parse_header(stream)
File "/home/user/anaconda3/lib/python3.6/site-packages/scipy/io/mmio.py", line 478, in _parse_header
self.__class__.info(stream)
File "/home/user/anaconda3/lib/python3.6/site-packages/scipy/io/mmio.py", line 232, in info
[asstr(part.strip()) for part in line.split()]
ValueError: not enough values to unpack (expected 5, got 3)
谢谢你,谢谢
2条答案
按热度按时间2g32fytz1#
Abaqus和SciPy对Matrix Market文件应该是什么样子的意见不一。
导致你的错误的第一个问题是SciPy期望每列之间有空格,因此你的“expected 5,got 3”错误。手动更改示例输入以包含空格:
错误将更改为
这对我来说是有意义的,因为the docs of
mmread
表示返回值为密集或稀疏矩阵取决于矩阵市场文件中的矩阵格式。
这可能意味着至少有一些元数据(头?)从文件中丢失,使其不标准。所以要么
1.该文件不是一个正确的.mtx文件,或
无论哪种方式,您都可能需要自己解析文件。如果您知道前四列的意思,那么您可能可以使用
numpy.loadtxt
或类似的东西轻松解析它。lf3rwulv2#
scipy遵循NIST矩阵市场https://math.nist.gov/MatrixMarket/的格式
当从Abaqus转储矩阵时,您必须在
*MATRIX OUTPUT
上包含Format=Coordinate
,这可能也是一个好主意,可以查看*MATRIX GENERATE
的其他选项,如ELSET=FOO
来控制矩阵数据。这将得到一个3列文件,定义一个稀疏矩阵,其中列为:
在此之后,您必须采取附加步骤,在文件中添加一些信息
第一行定义了nist mtx文件的类型
NIST中记录了复值矩阵和对称矩阵的其他选项。
要添加的第二行定义了矩阵大小
#ofentries
是abaqus生成的文件中的原始行数。nrows
和ncols
都可能是模型中节点数乘以活动自由度数,但是MPC和其他东西可以改变这一点。如果你有一个4x4矩阵,有两个非零元素,像这样,
文件会从abaqus中出来,
你编辑的mtx文件看起来像
最后,scipy将其作为稀疏矩阵导入,因此您可能需要利用scipy.sparse.linalg来处理它