我想使用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)
谢谢!
答案 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文件中的矩阵格式。
这可能意味着文件中至少缺少一些元数据(标题?),使其成为非标准文件。所以
这两种方法都可能需要您自己解析文件。如果您知道前四列的含义,则可以使用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中的原始行数。 nrows
和ncols
可能都是模型中的节点数乘以活动自由度的数,但是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对其进行任何处理