【问题标题】:How can I keep trailing zeros in a list or np.array?如何在列表或 np.array 中保留尾随零?
【发布时间】:2014-08-28 05:27:52
【问题描述】:

我正在使用 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 并在下一次计算中使用它,这是一种直方图用与有效数字数相关的 bin 宽度进行绘图。

【问题讨论】:

  • 你要计算什么?
  • 0.2000.2 之间没有区别。如果您关心这些零,请使用小数或字符串。
  • 在内部,这些数字将由浮点数表示。您所看到的只是该数字的表示。如果您需要精确的表示,您应该使用 gmp 库。
  • @poke 这不是计算结果的差异问题,而是为我存储信息的问题对于保留有效数字的原始数量很重要。感谢您的帮助!

标签: python arrays numpy rounding trailing


【解决方案1】:

我认为这个问题本身就有缺陷。 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])

【讨论】:

  • 谢谢,我知道这一点,但是例如认为您正在从实验中插入值,这些值在第三个数字之前都是精确的,这对于化学家或工程师来说是一个重要信息,我该如何存储它?
  • 如果你真的需要有效数字,你没有理由不能在列表中使用 Decimal 对象。 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())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2016-08-22
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多