我需要一个函数,只返回给定错误的值的重要部分。意思是这样的:
def (value, error):
""" This function takes a value and determines its significant
accuracy by its error.
It returns only the scientific important part of a value and drops the rest. """
magic magic magic....
return formated value as String.
到目前为止我写的内容是为了表明我的意思:
import numpy as np
def signigicant(value, error):
""" Returns a number in a scintific format. Meaning a value has an error
and that error determines how many digits of the
value are signifcant. e.g. value = 12.345MHz,
error = 0.1MHz => 12.3MHz because the error is at the first digit.
(in reality drop the MHz its just to show why.)"""
xx = "%E"%error # I assume this is most ineffective.
xx = xx.split("E")
xx = int(xx[1])
if error <= value: # this should be the normal case
yy = np.around(value, -xx)
if xx >= 0: # Error is 1 or bigger
return "%i"%yy
else: # Error is smaller than 1
string = "%."+str(-xx) +"f"
return string%yy
if error > value: # This should not be usual but it can happen.
return "%g"%value
我不想要的是像周围或周围的numpys一样的功能。这些函数需要一个值,并想知道这个值的哪个部分很重要。重点是,一般来说,我不知道有多少位数是重要的。它取决于该值的误差大小。 另一个例子:
值= 123,错误= 12,=&gt; 120 可以删除3,因为错误大小为10.但是这种行为并不那么重要,因为有些人仍然会为值写入123。这里没关系,但不完全正确。
对于大数字,“g”字符串运算符是一个可用的选择,但并不总是我需要的。对于例如 如果错误大于该值(例如,当某人想要测量不存在的东西时)。
值= 10,错误= 100
我仍然希望将10作为价值,因为我更了解它。该函数应该返回10而不是0.
我写的东西或多或少都有用,但它显然无论如何都没有效果或优雅。此外,我认为这个问题涉及数百人,因为每个科学家都必须以这种方式格式化数字。所以我确定在某个地方有一个现成的解决方案,但我还没有找到它。 可能我的谷歌技能不够好,但我在两天内无法找到解决方案,现在我问这里。
为了测试我的代码,我使用了以下内容,但需要更多代码。
errors = [0.2,1.123,1.0, 123123.1233215,0.123123123768]
values = [12.3453,123123321.4321432, 0.000321 ,321321.986123612361236,0.00001233214 ]
for value, error in zip(values, errors):
print "Teste Value: ",value, "Error:", error
print "Result: ", signigicant(value, error)
答案 0 :(得分:1)
import math
def round_on_error(value, error):
significant_digits = 10**math.floor(math.log(error, 10))
return value // significant_digits * significant_digits
示例:
>>> errors = [0.2,1.123,1.0, 123123.1233215,0.123123123768]
>>> values = [12.3453,123123321.4321432, 0.000321 ,321321.986123612361236,0.00001233214 ]
>>> map(round_on_error, values, errors)
[12.3, 123123321.0, 0.0, 300000.0, 0.0]
如果你想保留一个低于错误的值
if (value < error)
return value
else
def round_on_error(value, error):
significant_digits = 10**math.floor(math.log(error, 10))
return value // significant_digits * significant_digits