2015-01-26 21 views
5

Tôi chỉ đang cố gắng sử dụng một mảng mặt nạ để lọc ra một số mục nhập nan.Mặt nạ Numpy Python NaN không hoạt động

import numpy as np 
# x = [nan, -0.35, nan] 
x = np.ma.masked_equal(x, np.nan) 
print x 

này kết quả đầu ra như sau:

masked_array(data = [  nan -0.33557216   nan], 
     mask = False, 
    fill_value = nan) 

Calling np.isnan() trên x trả về boolean mảng chính xác, nhưng mặt nạ chỉ dường như không làm việc. Tại sao mặt nạ của tôi không hoạt động như tôi mong đợi?

+2

Bạn nên có lẽ sử dụng [ 'np.ma. masked_invalid() '] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ma .masked_invalid.html # numpy.ma.masked_invalid). –

+0

hoạt động, cảm ơn. nếu bạn đăng câu trả lời tôi có thể đóng câu hỏi này – chris

Trả lời

7

Bạn có thể sử dụng np.ma.masked_invalid:

import numpy as np 

x = [np.nan, 3.14, np.nan] 
mx = np.ma.masked_invalid(x) 

print(repr(mx)) 
# masked_array(data = [-- 3.14 --], 
#    mask = [ True False True], 
#  fill_value = 1e+20) 

Ngoài ra, sử dụng np.isnan(x) như tham số mask=-np.ma.masked_array:

print(repr(np.ma.masked_array(x, np.isnan(x)))) 
# masked_array(data = [-- 3.14 --], 
#    mask = [ True False True], 
#  fill_value = 1e+20) 

Tại sao không tiếp cận tác phẩm gốc của bạn? Bởi vì, thay vì phản đối, NaN không bằng NaN!

print(np.nan == np.nan) 
# False 

Đây thực sự là part of the IEEE-754 definition of NaN

1

Dưới đây là một thay thế mà không sử dụng mặt nạ:

import numpy as np 
#x = [nan, -0.35, nan] 
xmask=x[np.logical_not(np.isnan(x))] 
print(xmask) 

Kết quả:

array([-0.35])

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