Python 避免使用scipy io.mmwrite函数的科学符号

Python 避免使用scipy io.mmwrite函数的科学符号,python,file-io,scipy,format,sparse-matrix,Python,File Io,Scipy,Format,Sparse Matrix,我正在尝试使用from scipy:io.mmwrite导出以csr格式存储的''类型的稀疏矩阵,它擅长处理数据的稀疏性。 但是,该输出采用科学表示法: %%MatrixMarket matrix coordinate real general % 1719 2504 4304376 1 1 -9.0979224e-01 2 1 -1.6585451e-01 我想得到一个正常的浮点数,用于一个后期处理脚本,它需要mtx格式的经典浮点值 有没有一种方法可以轻松做到这一点 我目前的解决方案是再次读

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

%%MatrixMarket matrix coordinate real general
%
1719 2504 4304376
1 1 -9.0979224e-01
2 1 -1.6585451e-01
我想得到一个正常的浮点数,用于一个后期处理脚本,它需要mtx格式的经典浮点值

有没有一种方法可以轻松做到这一点

我目前的解决方案是再次读取写入的mtx文件,并将所有行的第三个字段转换为第三个字段,这是不高效的

有没有办法指定要使用的符号?比如:

np.set\u打印选项(suppress=True)

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


谢谢你

这里有一个可能对你有用的快速破解方法。(这是一种黑客行为,因为它覆盖了一个类的私有静态方法,而该类并没有真正作为公共API的一部分进行记录。如果在未来版本的SciPy中更改了底层代码,这种黑客行为可能不再有效。)

创建一个子类
scipy.io.mmfile.mmfile
,该子类重写
\u field\u 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)
请查看该文件:

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
您可能需要调整在函数
\u field\u template()
中创建的格式字符串。小数位数固定的格式的一个潜在问题是,如果一个条目的值为
0.00000098765432
,它将被打印为
0.0000000 99
0.000000 123
将被打印为
0.00000000
(假设您使用了与上述示例相同的
精度)


不过,请注意,矩阵市场文件的适当读取器应该能够处理以科学符号书写的数字

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