python - scipy io.mmwrite 函数避免使用科学记数法
问题描述
我正在尝试导出一个'<class'numpy.float32'>类型的稀疏矩阵,以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)
我还尝试强制转换为双精度/浮点数,但找不到相关线程。
谢谢
解决方案
这是一个可能对您有用的快速技巧。(这是一个 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()
。具有固定小数位数的格式的一个潜在问题是,如果条目具有 value 0.00000098765432
,它将被打印为0.000000099
,并且0.0000000000123
将被打印为0.00000000
(假设您使用与precision
上面示例中的相同)。
但请注意,矩阵市场文件的适当阅读器应该能够处理以科学记数法编写的数字。
推荐阅读
- php - laravel useCurrentOnUpdate 问题
- sql - Unkown 是否等同于 PostgreSQL 中的 Null?
- javascript - 使用 Vanilla JavaScript 检测 css backgroundColor 的变化
- reactjs - Flask App 部署到 Heroku 时出错 at=error code=H10 desc=“App crashed” method=GET path=“/”
- excel - (Excel) 如何将一列配对数据重新编译成两列
- javascript - React-Native 测试库/Jest:无法读取属性“TouchableOpacity”
- javascript - 使用 html 和 JavaScript 根据时间记录创建 Open/Closed 商店
- android-studio - 如何让 Android Studio 北极狐“运行所有测试”工作?
- c - ffmpeg 可以解析/解码 AVCC 格式的数据包吗?
- angularjs - Ionic/AngularJS 的多级(子视图)路由