7

有没有办法限制浮点数的表示,使它们只对应于物理单位中使用的前缀。

一个例子会更清楚:

0.01   ->   currently       1e-02  
       ->   what I'd like   10e-03

0.0001   ->   currently       1e-04  
         ->   what I'd like   100e-06

其背后的动机是我正在做一些时间测量,并且将表示作为 1000 的表示更加用户友好。我知道10e-03 -> 10mili或者100e-06 -> 100u

更新

对于 numpy 1.7< 中有一个formatter属性set_printoptions()。我要去的解决方案是编写一个内联函数来进行格式化。一旦设置,它的格式应该是全局可用的。

关于格式化程序的参考

4

2 回答 2

4

如果有帮助,“解决方案”可以是:

ticker.EngFormatter()matplotlib库中与 numpy 一起使用set_printoptions。正如@TheMeaningfulEngineer 的更新链接所指出的,它的格式化程序属性需要一个键的字典,每个键都有一个可调用的值(基本上是一个函数)。可能的键基本上是应用格式的类型。这些可以在 numpy 的 文档中找到。

Matplolib 代码不使用指数,而是使用 SI 单位(n、μ、k、k、M 等)

例子:

import numpy as np
from matplotlib import ticker
formatter = ticker.EngFormatter()
np.set_printoptions(formatter={'float': formatter})
np.array([0.0000001, 0.000001, 10, 1000., 10000, 1000000])

这导致:

array([100 n, 1 μ, 10, 1 k, 10 k, 1 M])

有关如何重新定义 SI 单位的更多信息,我推荐此博客


更新:

对于那些感兴趣的人,matplolib 的 EngFormatter可以接受诸如units ='Hz'之类的参数,以便在前缀值之后打印单位。像这样:

array([100 n Hz, 1 μ Hz, 10  Hz, 1 k Hz, 10 k Hz, 1 M Hz])

此外,可以pandas通过覆盖相应的格式化程序来应用相同的想法。

pd.options.display.float_format = formatter
于 2019-05-29T09:10:01.243 回答
1

我认为这个主题可能对你有帮助。另一方面,我会尝试为特定范围内的值创建一些“桶”并检查一个简单的条件 >(范围内的最小值),然后将该值乘以一个范围,例如 2e-5 乘以 1e6 得到 20u . 效率不高,但很容易。

于 2013-07-29T17:19:23.023 回答