【问题标题】:Propagation of uncertainties with Astropy用 Astropy 传播不确定性
【发布时间】:2015-12-13 12:39:26
【问题描述】:

在以前的天文学版本中,可以通过以下方式处理不确定性的传播:

from astropy.nddata import NDData, StdDevUncertainty

x = NDData( 16.0, uncertainty=StdDevUncertainty( 4.0 ))
y = NDData( 361.0, uncertainty=StdDevUncertainty( 19.0 ))

print x.add(y)

对 NDData 的更改似乎已删除此功能。我得到“AttributeError:'NDData'对象没有属性'add'”,我在文档中找不到任何有用的建议。现在如何处理错误传播?

【问题讨论】:

  • 您可能需要查看不确定性模块

标签: python astropy


【解决方案1】:

看起来这个功能已经被移到了一个 mixin 中,NDArithmeticMixin。

example in the Arithmetic mixin documentation 建议创建自己的类并使用它。

所以你的例子会变成:

from astropy.nddata import NDData, StdDevUncertainty, NDArithmeticMixin
class MyData(NDData, NDArithmeticMixin):
    pass
x = MyData( 16.0, uncertainty=StdDevUncertainty( 4.0 ))
y = MyData( 361.0, uncertainty=StdDevUncertainty( 19.0 ))
z = x.add(y)
print(z)
print(z.uncertainty.array)

给出:

MyData(377.0)
19.416487838947599

更新

NDDataArray 类实际上做了上面的MyData 类做的事情:它包括三个 mixin(算术、io 和切片)。
这使上面的内容更简单:

from astropy.nddata import StdDevUncertainty, NDDataArray
x = NDDataArray(16, uncertainty=StdDevUncertainty(4.0))
y = NDDataArray(361, uncertainty=StdDevUncertainty(19.0))
z = x.add(y)
print(z)
print(z.uncertainty.array)

我认为这个界面相当笨拙。也许随着时间的推移它会变得清晰,变得像

z = x + y
print(z)

377.0 +/- 19.416487838947599

【讨论】:

  • 完美!谢谢你。它甚至似乎可以处理单位,这比我希望的要多
  • @TheBigH 我发现NDDataArray 可以满足您的需求,并且无需创建自己的类。另请参阅我的答案中的更新。
  • 这看起来比不确定性要笨拙得多。与不确定性相比,这有什么优势?
  • @MaxNoe 所有细节都在the nddata documentation 中,但非常简单:NDData 允许存储掩码、元数据、不确定性、单位等。因此,它可以做的不仅仅是传播不确定性。
  • @Evert:你lose is the correct handling of correlations的一件事。 :) 此外,Pint 包处理不确定性和单位,如果我没记错的话,它也与 NumPy 兼容,因此您还可以获得掩码。因此,在我看来,使用 Pint,您只会丢失元数据,并获得正确的计算(相关性)。由于执行正确的计算更难,但它也可能更慢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多