有没有办法限制浮点数的表示,使其仅对应于物理单位中使用的前缀。
举个例子会更清楚:
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< there is a
formatter
中的属性set_printoptions()
。我正在寻找的解决方案是编写一个内联函数来进行格式化。
设置后,格式应在全局范围内可用。
如果有帮助,“解决方案”可以是:
将
ticker.EngFormatter()
库中的 matplotlib
与 numpy 的 set_printoptions
一起使用。正如 @TheMeaningfulEngineer 的更新链接所指出的,它的 formatter 属性需要一个键字典,每个键都有一个可调用值(基本上是一个函数)。可能的键基本上是要应用格式的类型。这些可以在 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
我认为这个主题可能对您有帮助。另一方面,我会尝试为特定范围内的值创建一些“桶”,并检查一个简单的条件>(范围内的最低值),然后将该值乘以一个范围,例如2e-5乘以1e6得到20u。不太有效,但很容易。
我编写了一个名为 sciform 的 PyPi 包,它支持这种类型的格式设置。
pip install sciform
from sciform import Formatter
sform = Formatter(
exp_mode="engineering",
)
for num in [0.01, 0.0001]:
result = sform(num)
print(f'{num} -> {result}')
# 0.01 -> 10e-03
# 0.0001 -> 100e-06