我有一个numpy数组,在某些位置有NaN值。
>>> 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.]])
我想制作掩码,如果该行中存在NaN值,则会将整行设为False
值。如下所示。
>>> 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[,:]
任何人都可以帮我解决这个问题吗?
答案 0 :(得分: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 :(得分:1)
mask = lambda x: False if numpy.nan else True
array_mask = numpy.vectorize(mask)
masked_d1 = array_mask(d1)
答案 2 :(得分:1)
d2 = np.asarray([x for x in d1 if not np.isnan(x.sum())])
使用列表理解(这会删除带有NaN的行,并且不会将它们替换为False,因为它是一个浮点数组)