Numpy工程符号

时间:2013-07-29 17:10:44

标签: python numpy

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

一个例子将使它更清晰:

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 -> 10mili100e-06 -> 100u

更新

numpy 1.7< formatter中有set_printoptions()个属性。我正在寻找的解决方案是编写一个可以进行格式化的内联函数。 设置后,格式化应该全局可用。

Reference about the formatter

2 个答案:

答案 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