UserWarning: преобразование маскированного элемента в nan

Выполнение python script (путь для включения сюда) Я написал приводит к предупреждению. Я не знаю, по какой строке в моем коде это поднимается. Как я могу получить эту информацию?

Кроме того, что это значит? На самом деле, я не знал, что использовал какой-то маскированный массив?

/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.")

Ответ 1

Вы можете использовать модуль 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

Ответ 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().