2017-07-17 78 views
2

我有一個numpy數組,它在某些位置有NaN值。Numpy row wise masking

>>> d1 
array([[ 0., 1., 2., nan, 4., 5., nan, 7.], 
     [ 8., 9., 10., nan, 12., 13., nan, 15.], 
     [ 16., 17., 18., nan, 20., 21., nan, 23.], 
     [ 24., 25., 26., nan, 28., 29., 30., 31.], 
     [ 32., 33., 34., 35., 36., 37., 38., 39.], 
     [ 40., 41., 42., 43., 44., 45., 46., 47.], 
     [ 48., 49., 50., 51., 52., 53., 54., 55.], 
     [ 56., 57., 58., 59., 60., 61., 62., 63.]]) 

我要讓口罩,這將使整個行作爲False值如果存在該行的NaN值。如下所示。

>>> mask 
array([[False, False, False, False, False, False, False, False], 
     [False, False, False, False, False, False, False, False], 
     [False, False, False, False, False, False, False, False], 
     [False, False, False, False, False, False, False, False], 
     [ True, True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True, True], 
     [ True, True, True, True, True, True, True, True]], dtype=bool) 

我試圖應用下面的面具但它沒有工作。

mask = NaN not in d1[,:] 

任何人都可以幫助我弄清楚這一點嗎?

回答

4

這裏有一些方法 -

np.repeat(~np.isnan(d1).any(1,keepdims=1),d1.shape[1],axis=1) 
~np.isnan(d1).any(1,keepdims=1)*([True]*d1.shape[1]) 
np.tile(~np.isnan(d1).any(1,keepdims=1),d1.shape[1]) 
np.broadcast_to(~np.isnan(d1).any(1,keepdims=1), d1.shape) 
np.broadcast_to(~np.isnan(d1).any(1), d1.shape).T 
1

使用列表理解numpy.vectorize

mask = lambda x: False if numpy.nan else True 
array_mask = numpy.vectorize(mask) 
masked_d1 = array_mask(d1) 
1
d2 = np.asarray([x for x in d1 if not np.isnan(x.sum())]) 

的一種方法(這行刪除您的NaN,並且不以虛假的取代它們它是一組浮動物)