微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

避免对科学的io.mmwrite函数使用科学记号

如何解决避免对科学的io.mmwrite函数使用科学记号

我正在尝试使用来自scipy的io.mmwrite导出类型为的稀疏矩阵,该稀疏矩阵以csr格式存储:io.mmwrite,擅长处理数据稀疏性。 但是,此输出采用科学计数法:

%%MatrixMarket matrix coordinate real general
%
1719 2504 4304376
1 1 -9.0979224e-01
2 1 -1.6585451e-01

并且我想以正常浮点数获得它,以用于需要mtx格式的经典浮点值的后处理脚本。

有没有一种方法可以轻松实现呢?

我当前的解决方案涉及再次读取已写入的mtx文件,并将所有字段的第3个字段转换为第三行,这不是很节省时间...

有没有一种方法可以指定使用的符号?像这样的东西:

np.set_printoptions(suppress=True)

我还尝试过强制转换为double / float,但找不到相关的线程。

谢谢

解决方法

这里有个快速技巧,可能对您有用。 (这是黑客,因为它会覆盖未真正记录为公共API一部分的类的私有静态方法。如果在以后的SciPy版本中更改了基础代码,则此黑客可能不再起作用。)>

创建scipy.io.mmfile.MMFile的子类,该子类将覆盖_field_template方法,以便它返回自定义格式的字符串。例如

from scipy.io.mmio import MMFile


class MMFileFixedFormat(MMFile):

    def _field_template(self,field,precision):
        # Override MMFile._field_template.
        return f'%.{precision}f\n'

要使用此类编写矩阵市场文件,请将对scipy.io.mmwrite函数的使用替换为MMFileFixedFormat().write

这是ipython会话中的一个示例。稀疏矩阵在a中。

In [77]: a
Out[77]: 
<5x5 sparse matrix of type '<class 'numpy.float32'>'
    with 8 stored elements in Compressed Sparse Row format>

In [78]: a.A
Out[78]: 
array([[0.27621606,0.,0.7780487,0.        ],[0.7295764,[0.09457383,0.13346413,[0.,0.11267778,[0.05113978,0.9891698,0.        ]],dtype=float32)

这是将a写到文件"a.mtx"的行。

In [79]: MMFileFixedFormat().write('a.mtx',a,precision=9)                                                         

看看文件:

In [80]: !cat a.mtx                                                                                                 
%%MatrixMarket matrix coordinate real general
%
5 5 8
1 1 0.27621606
1 4 0.77804869
2 1 0.72957641
3 1 0.09457383
3 3 0.13346413
4 3 0.11267778
5 1 0.05113978
5 4 0.98916978

您可能要调整在函数_field_template()中创建的格式字符串。小数位数固定的格式的潜在问题是,如果条目的值为0.00000098765432,则它将打印为0.000000099,而0.0000000000123将打印为{ {1}}(假设您使用与上面示例相同的0.00000000)。


但是请注意,矩阵市场文件的适当阅读者应该能够处理以科学计数法表示的数字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。