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

amrnrhlw  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(154)

我想使用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)

谢谢你,谢谢

2g32fytz

2g32fytz1#

Abaqus和SciPy对Matrix Market文件应该是什么样子的意见不一。
导致你的错误的第一个问题是SciPy期望每列之间有空格,因此你的“expected 5,got 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表示返回值为
密集或稀疏矩阵取决于矩阵市场文件中的矩阵格式。
这可能意味着至少有一些元数据(头?)从文件中丢失,使其不标准。所以要么
1.该文件不是一个正确的.mtx文件,或

  1. SciPy不支持给定的格式
    无论哪种方式,您都可能需要自己解析文件。如果您知道前四列的意思,那么您可能可以使用numpy.loadtxt或类似的东西轻松解析它。
lf3rwulv

lf3rwulv2#

scipy遵循NIST矩阵市场https://math.nist.gov/MatrixMarket/的格式
当从Abaqus转储矩阵时,您必须在*MATRIX OUTPUT上包含Format=Coordinate,这可能也是一个好主意,可以查看*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矩阵,有两个非零元素,像这样,

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来处理它

相关问题