2013-04-26 36 views
12

Thực thi tập lệnh python (cách để bao gồm ở đây) Tôi đã viết dẫn đến một thông báo cảnh báo. Tôi không biết dòng mã nào của tôi được nâng lên. Tôi có thể lấy thông tin này bằng cách nào?UserWarning: chuyển đổi phần tử có mặt nạ thành nan

Hơn nữa, điều này có ý nghĩa gì? Trong thực tế, tôi không biết tôi đã sử dụng một mảng mặt nạ của một số loại?

/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

Tôi muốn đặt một rất nhiều câu lệnh 'print' xung quanh tất cả các thủ phạm có thể có trong mã của bạn, điều này sẽ cho bạn thời gian của những gì đang xảy ra, ở đâu đó giữa' print's bạn sẽ thấy cảnh báo này, theo cách này bạn có thể bản địa hóa vấn đề của bạn. Nếu nó giúp cảnh báo xuất phát từ 'MaskedArray .__ float__', mà dường như chuyển đổi mảng thành float. Một cách khác là (tạm thời) chỉnh sửa 'core.py' để làm cho nó xuất thông tin hữu ích như các thuộc tính của mảng. Debuggers cũng là lựa chọn khả thi. – gatto

+0

Các báo cáo in đã giúp tôi tìm ra dòng tương ứng, thx! Tôi chỉ nghĩ rằng có thể có một giải pháp phức tạp hơn. – HyperCube

Trả lời

11

Bạn có thể sử dụng mô-đun warnings để chuyển đổi cảnh báo thành ngoại lệ. Phương pháp đơn giản nhất được gọi là simplefilter. Đây là một ví dụ; mã tạo ra cảnh báo là trong func2b(), do đó, có một traceback không hoàn hảo.

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

Khi dòng có chứa các cuộc gọi đến simplefilter là nhận xét ra, đầu ra là

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

Với dòng đó bao gồm, bạn nhận được một traceback:

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

Cũng có thể vá MaskedArray.__float__ để nó tăng ngoại lệ, theo cách này bạn sẽ thấy dấu vết ngăn xếp, bao gồm mã của bạn. Và vá có thể được thực hiện trong mã của bạn, không cần phải gây rối với .../ma/core.py.

Ví dụ cho 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() 

Và đầu ra:

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 

Như bạn có thể nhìn thấy nó cho bạn thấy phù hợp với m.squeeze().

Các vấn đề liên quan