Numpy行明智的掩蔽

时间:2017-07-17 16:18:06

标签: python numpy

我有一个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[,:]

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 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)

使用numpy.vectorize

的方法
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,因为它是一个浮点数组)