如何读取Abaqus .mtx文件? Scipy.io.mmread提供了“没有足够的值来解压缩”错误

时间:2018-10-23 11:00:32

标签: python io scipy

我想使用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 个答案:

答案 0 :(得分:0)

Abacus和scipy对于Matrix Market文件的外观并不一致。

引起错误的第一个问题是scipy期望每一列之间都留有空格,因此出现“预期为5,得到3”错误。手动更改示例输入以包含空格:

1, 1, 1, 1,  1.939258533333333e-02
1, 2, 1, 2,  1.939258533333333e-02
2, 1, 2, 1,  1.889629366666666e-02

错误更改为

ValueError: source is not in Matrix Market format

这对我来说很有意义,因为the docs of mmread表示返回值为

  

密集矩阵或稀疏矩阵,具体取决于Matrix Market文件中的矩阵格式。

这可能意味着文件中至少缺少一些元数据(标题?),使其成为非标准文件。所以

  1. 该文件不是正确的.mtx文件,或者
  2. scipy不支持给定格式

这两种方法都可能需要您自己解析文件。如果您知道前四列的含义,则可以使用numpy.loadtxt或类似方法轻松地对其进行解析。

答案 1 :(得分:0)

scipy遵循NIST矩阵市场的格式 https://math.nist.gov/MatrixMarket/

从Abaqus中转储矩阵时,您必须在Format=Coordinate上包含*MATRIX OUTPUT,看看*MATRIX GENERATE的其他选项(例如ELSET=FOO)来控制矩阵也是一个好主意数据。

这将为您提供3列文件,其中定义了具有以下列的稀疏矩阵:

i j A(i,j)

此后,您必须执行将某些信息添加到文件的附加步骤

第一行定义了nist mtx文件的类型

%%MatrixMarket matrix coordinate real general

NIST记录了复值矩阵和对称矩阵的其他选择。

第二行用于定义矩阵大小

    nrows ncols #ofentries

#ofentries是所生成文件abaqus中的原始行数。 nrowsncols可能都是模型中的节点数乘以活动自由度的数,但是MPC和其他事物可以改变这一点。

因此,如果您有4x4矩阵,其中包含2个这样的非零条目

0  0  0  0
0 45  0  0
0  0 74  0
0  0  0  0 

文件将从abaqus中提取出来

2 2 45
3 3 74

和您编辑的mtx文件如下

%%MatrixMarket matrix coordinate real general
4 4 2
2 2 45
3 3 74

最后scipy将其导入为稀疏矩阵,因此您可能需要利用scipy.sparse.linalg对其进行任何处理