是否有办法限制浮点数的表示,使它们只对应于物理单位中使用的前缀。
一个例子将使它更清晰:
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()
个属性。我正在寻找的解决方案是编写一个可以进行格式化的内联函数。
设置后,格式化应该全局可用。
答案 0 :(得分:1)
我认为this topic可能会对您有所帮助。另一方面,我会尝试为特定范围内的值创建一些“桶”并检查简单条件> (范围中的最低值),然后将该值乘以一个范围,例如2e-5乘1e6得到20u。效率不高,但很容易。
答案 1 :(得分:0)
如果有帮助,“解决方案”可以是:
将ticker.EngFormatter()
库中的matplotlib
与numpy的set_printoptions
一起使用。正如@TheMeaningfulEngineer的更新链接所指出的那样,它的 formatter 属性要求每个键具有可调用值(基本上是一个函数)的字典。可能的键基本上是要应用格式的类型。这些可以在numpy的documentation中找到。
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单位的更多信息,建议使用this blog。
对于感兴趣的人,matplolib's 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