Python Uncertainties Unumpy type bug?

时间:2015-05-31 12:16:10

标签: python multidimensional-array types

我对蟒蛇的不确定性包很难。我必须用python评估实验数据,我已经做了一段时间但从未遇到过以下问题:

>>>from uncertainties import ufloat
>>>from uncertainties import unumpy as unp
>>>u = ufloat(5, 1)
>>>l = unp.log(u)
>>>print(l)
1.61+/-0.2

一切似乎都没事,对吧?但是这里有一个奇怪的部分:

>>>print(type(l))
<type 'numpy.ndarray'>

这是巨大的问题,因为这是我遇到它的方式:

>>>print(l.n)
AttributeError: 'numpy.ndarray' object has no attribute 'n'

现在,在我的工作中,我迫切需要线性回归的名义值和标准差。这真的很奇怪,让我觉得它实际上是一个错误,事实上,打印变量实际上就像预期的那样工作但python“认为”它的类型是一个数组,当它实际上应该是一个ufloat。

有关简单解决方法的任何想法或提示吗?你认为这是一个错误还是我错过了什么,这实际上是我的错误?

为了防止任何人问​​为什么我这么简单的计算:这只是一个例子当然。在我的实际工作中,我有许多更复杂的值存储在数组中。

Edit1:https://pythonhosted.org/uncertainties/user_guide.html

EDIT2: 好的,这是我实际遇到问题的代码,上面只是为了说明问题。

d, t, n = loadtxt('mess_blei_gamma.txt', unpack=True)
fh = open('table_blei.txt', 'w')
nn = []
ln = []
for i in range(0, len(d)):
    nn.append(norm(n[i], t[i], n0))
    ln.append(unp.log(nn[i]))
    fh.write(tex(str(d[i])+" & "+str(t[i])+" & "+str(n[i])+" & "+str(nn[i])+" & "+str(ln[i]))) #works how it's supposed to, the table is perfectly fine
fh.close()

print(unp.nominal_values(nn)) #works fine
print(unp.nominal_values(ln)) #error

2 个答案:

答案 0 :(得分:2)

首先,许多unumpy对象基本上都是numpy数组:

>>>arr = unp.uarray([1, 2], [0.01, 0.002])
>>>arr
[1.0+/-0.01 2.0+/-0.002]
>>>type(arr)
<type 'numpy.ndarray'>

所以你不应该感到惊讶。
顺便说一下,ufloat是一个功能,而不是一个类型:

>>>x = ufloat(0.20, 0.01)  # x = 0.20+/-0.01
>>>print type(x)
<class 'uncertainties.Variable'>
>>>type(ufloat)
<type 'function'>

其次,为了得到名义价值,你应该使用:

unumpy.nominal_values(l)

编辑: 在您编辑原始邮件后,我想我理解您的问题。您可以在for循环之外使用unumpy.log,如下所示:

>>>nn = [ ufloat(1, 2), ufloat(53, 4)]
>>>ln = unp.log(nn)
>>>ln
[0.0+/-2.0 3.970291913552122+/-0.07547169811320754]
>>>type(ln)
<type 'numpy.ndarray'>
>>>(unp.nominal_values(ln)) #now it works fine
[ 0.          3.97029191]

我也同意这种行为有点奇怪。

运行良好并实现目标的代码:

d, t, n = loadtxt('mess_blei_gamma.txt', unpack=True)
fh = open('table_blei.txt', 'w')
nn = (norm(n[i], t[i], n0) for i  range(0, len(d)))
ln = unp.log(nn)
for i in range(0, len(d)):
    fh.write(tex(str(d[i])+" & "+str(t[i])+" & "+str(n[i])+" & "+str(nn[i])+" & "+str(ln[i]))) #works how it's supposed to, the table is perfectly fine
fh.close()

print(unp.nominal_values(nn)) 
print(unp.nominal_values(ln)) 

答案 1 :(得分:0)

(免责声明:我是不确定因素包的作者。)

uncertainties.unumpy模块的数学函数用于 NumPy数组,其中包含具有不确定性的数字(与数组在数组上使用numpy.log的方式相同,因为{{1}不打算在数组上工作。)

在你的例子中,你想要一个带有不确定性的简单 float 的日志:

math.log
>>> from uncertainties import ufloat >>> u = ufloat(5, 1) 模块中的

There are dedicated functions for this(相当于标准uncertainties.umath模块):

math

您观察到的内容类似于NumPy在Python标量上使用其数学函数时所执行的操作:

>>> from uncertainties.umath import log
>>> log_value = log(u)  # This is a UFloat, like u (and not a 1-element array)
>>> print log_value.n  # Nominal value, as expected