Numpy 工程符号

问题描述 投票:0回答:3

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

举个例子会更清楚:

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()
。我正在寻找的解决方案是编写一个内联函数来进行格式化。 设置后,格式应在全局范围内可用。

有关格式化程序的参考

python numpy
3个回答
4
投票

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

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

1
投票

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


0
投票

我编写了一个名为 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
© www.soinside.com 2019 - 2024. All rights reserved.