UserWarning:将屏蔽元素转换为nan

时间:2013-04-26 12:36:48

标签: python numpy

执行python脚本(这里包含long的方式)我写了一条警告信息。我不知道我的代码中的哪一行会被引发。我怎样才能获得这些信息?

此外,这究竟是什么意思?事实上,我不知道我使用的是某种蒙版数组?

/usr/lib/pymodules/python2.7/numpy/ma/core.py:3785: UserWarning: Warning: converting a masked element to nan.
warnings.warn("Warning: converting a masked element to nan.")

2 个答案:

答案 0 :(得分:12)

您可以使用warnings模块将警告转换为例外。最简单的方法称为simplefilter。这是一个例子;生成警告的代码在func2b()中,因此存在非特异性回溯。

import warnings


def func1():
    print "func1"

def func2():
    func2b()
    print "func2"

def func2b():
    warnings.warn("uh oh")

def func3():
    print "func3"


if __name__ == "__main__":
    # Comment the following line to see the default behavior.
    warnings.simplefilter('error', UserWarning)
    func1()
    func2()
    func3()

当包含对simplefilter的调用的行被注释掉时,输出为

func1
warning_to_exception.py:13: UserWarning: uh oh
  warnings.warn("uh oh")
func2
func3

包含该行后,您将获得追溯:

func1
Traceback (most recent call last):
  File "warning_to_exception.py", line 23, in <module>
    func2()
  File "warning_to_exception.py", line 9, in func2
    func2b()
  File "warning_to_exception.py", line 13, in func2b
    warnings.warn("uh oh")
UserWarning: uh oh

答案 1 :(得分:2)

也可以修补MaskedArray.__float__以便它引发异常,这样你就会看到堆栈跟踪,其中包括你的代码。修补可以在您的代码中完成,无需弄乱.../ma/core.py

squeeze()的示例:

import numpy as np
from numpy import ma

def raise_me(*args, **kw):
    raise Exception('ping')

ma.MaskedArray.squeeze = raise_me

def test():
    x = np.array([(1, 1.), (2, 2.)], dtype=[('a',int), ('b', float)])
    m = x.view(ma.MaskedArray)
    m.squeeze()

def main():
    test()

main()

输出:

Traceback (most recent call last):
  File "t.py", line 19, in <module>
    main()
  File "t.py", line 17, in main
    test()
  File "t.py", line 13, in test
    m.squeeze()
  File "t.py", line 6, in raise_me
    raise Exception('ping')
Exception: ping

如您所见,它会显示m.squeeze()行。