【问题标题】:Avoid scientific notation for scipy io.mmwrite functionscipy io.mmwrite 函数避免使用科学记数法
【发布时间】:2020-11-09 08:55:51
【问题描述】:

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

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

并且我想以普通浮点数为后处理脚本获取它,该脚本期望 mtx 格式的经典浮点值。

有没有办法轻松实现?

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

有没有办法指定 scipy 使用的符号?类似的东西:

np.set_printoptions(suppress=True)

我还尝试强制转换为双精度/浮点数,但找不到相关线程。

谢谢

【问题讨论】:

    标签: python file-io scipy format sparse-matrix


    【解决方案1】:

    这里有一个可能对您有用的快速技巧。 (这是一个 hack,因为它覆盖了一个没有真正记录为公共 API 一部分的类的私有静态方法。如果在 SciPy 的未来版本中更改了底层代码,这个 hack 可能不再起作用。)

    创建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.        , 0.7780487 , 0.        ],
           [0.7295764 , 0.        , 0.        , 0.        , 0.        ],
           [0.09457383, 0.        , 0.13346413, 0.        , 0.        ],
           [0.        , 0.        , 0.11267778, 0.        , 0.        ],
           [0.05113978, 0.        , 0.        , 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 将打印为0.00000000(假设您使用与上例中的precision 相同)。


    但请注意,矩阵市场文件的适当阅读器应该能够处理以科学记数法书写的数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多