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()
.