如何在列表或np.array中保留尾随零?

3

我正在使用Python进行一些统计分析,我有这个数据集:

test=[0.200,0.220,0.220,0.120,0.330,0.330]

Python会自动将其转换为[0.2、0.22、0.22、0.12、0.33、0.33],但实际上零是我计算中的有效数字,所以我希望在数组中保留它们。 我知道可以导入十进制并对单个值使用Decimal,但如何在列表或np.array中保留所有尾随零?
假设您正在使用Python脚本插入实验数据,数据在第三位之前很精确,因此我想跟踪0.020实际上意味着第三位是0。我怎样才能完成这个任务?对于化学家或工程师来说,这是一个非常重要的问题。
我需要这个功能是因为我必须跟踪下一个计算的有效数字...理想情况下,我必须计算出该情况下的有效数字数量,即3,并在下一个计算中使用它,这是一种直方图绘制,其区间宽度与有效数字的数量相关。

1
你想要计算什么? - timgeb
3
“0.200”和“0.2”没有区别。如果你关注这些零,可以使用小数或者字符串来表示。 - poke
2
在内部,这些数字将由浮点数表示。您看到的只是该数字的表示。如果您需要精确表示,则应使用gmp库。 - Bort
@poke 这不是计算结果的差异问题,而是存储信息的问题。对我来说,保留原始有效数字的数量非常重要。谢谢帮助! - G M
1个回答

3
这个问题本质上有点错误。不仅在0.2000.2之间没有实际区别,而且计算机并不以十进制格式存储数据,而是以二进制格式存储。(为了达到这个目的,电脑可能会将0.2存储为0.20000000000000000000001,只是因为精度问题,但由于二进制表示的限制,实际上无法在存储级别截断。)
如果你只想打印三个有效数字的值,可以使用:
print "%.3f" % float_var

如果您想将所有未来的计算结果保留三位小数,可以使用以下代码:

round(float_var,3)

但是就实际计算而言,这并没有什么可获得的好处。无论是使用Python、C、Java还是纸和笔,0.200对计算的影响与0.2相同。
编辑:如果您真的需要有效数字,则可以在列表中使用 Decimal 对象。文档https://docs.python.org/2/library/decimal.html提供了一种将其从字符串快速转换为十进制数的方法。
data = map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split())

如果您已经有一个浮点数数组,需要将其转换为三个有效数字,可以通过以下方式进行操作:

import decimal

def toDecimal(x):  # x is a float.
  return decimal.Decimal(str(x)).quantize(decimal.Decimal('1.000'))

data = map(toDecimal, float_var_list)

就计算有效数字的数量而言,我认为没有内置函数可以做到这一点,但是通过处理字符串,不会遇到太多麻烦就可以得出答案。

def numDigits(x):  # x is a Decimal object.
  splitDecimal = str(x).split(".")
  return len(splitDecimal[1])

谢谢,我知道这个。但是举个例子,假设你正在插入实验数据,这些数据精确到小数点后第三位,对于化学家或工程师来说,这是重要的信息。那么我该如何存储它呢? - G M
如果你真的需要有效数字,没有理由不能在列表中使用Decimal对象。 https://docs.python.org/2/library/decimal.html提供了一种相当快速的批量转换方法:`data = map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split())` - TheSoundDefense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接