Python 当存在缺失值时,删除具有相同非缺失值的numpy数组列

Python 当存在缺失值时,删除具有相同非缺失值的numpy数组列,python,arrays,numpy,missing-data,Python,Arrays,Numpy,Missing Data,我有一个numpy数组,我需要从中删除对于非缺失单元格具有相同值的列,并删除所有缺失值的列。 阵列: >>> x = np.array([[ 1., 2., 2., np.NaN, 2., 2., 1.], [ 2., np.NaN, 1., np.NaN, 2., 2., 1.], [np.NaN, 1., 1., np.NaN, 2., 2., 1.], [ 1., 2., np.NaN, np.NaN

我有一个numpy数组,我需要从中删除对于非缺失单元格具有相同值的列,并删除所有缺失值的列。 阵列:

>>> x = np.array([[ 1.,  2.,  2., np.NaN,  2.,  2.,  1.],
       [ 2., np.NaN,  1., np.NaN,  2.,  2.,  1.],
       [np.NaN,  1.,  1., np.NaN,  2.,  2.,  1.],
       [ 1.,  2., np.NaN, np.NaN,  2., np.NaN,  0.],
       [ 0.,  1.,  1., np.NaN,  2., np.NaN,  0.],
       [ 1.,  1.,  1., np.NaN,  2.,  2.,  1.],
       [np.NaN,  1.,  0., np.NaN,  2., np.NaN,  2.],
       [ 2.,  1.,  1., np.NaN,  2.,  2.,  1.]])

>>> x
array([[ 1.,  2.,  2., nan,  2.,  2.,  1.],
       [ 2., nan,  1., nan,  2.,  2.,  1.],
       [nan,  1.,  1., nan,  2.,  2.,  1.],
       [ 1.,  2., nan, nan,  2., nan,  0.],
       [ 0.,  1.,  1., nan,  2., nan,  0.],
       [ 1.,  1.,  1., nan,  2.,  2.,  1.],
       [nan,  1.,  0., nan,  2., nan,  2.],
       [ 2.,  1.,  1., nan,  2.,  2.,  1.]])
我可以删除缺少所有值的列(列索引3)

我可以删除所有行中具有相同值的所有列(列索引4)

但是,如何删除第6列(索引5),其中非缺失值相同,但缺失值的存在会扰乱布尔检查

编辑:期望的结果

array([[ 1.,  2.,  2.,  1.],
       [ 2., nan,  1.,  1.],
       [nan,  1.,  1.,  1.],
       [ 1.,  2., nan,  0.],
       [ 0.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.],
       [nan,  1.,  0.,  2.],
       [ 2.,  1.,  1.,  1.]])

可以使用位运算符链接多个掩码。你基本上需要两个面具

  • 一个用于
    NaNs
  • 检查第一行值是否等于列的其余部分
然后用位
链接这两个条件,并检查
所有
行是否满足条件:

m1 = np.isnan(x)
m2 = x[0] == x
x[:, ~(m2|m).all(0)]

array([[ 1.,  2.,  2.,  1.],
       [ 2., nan,  1.,  1.],
       [nan,  1.,  1.,  1.],
       [ 1.,  2., nan,  0.],
       [ 0.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.],
       [nan,  1.,  0.,  2.],
       [ 2.,  1.,  1.,  1.]])

可以使用位运算符链接多个掩码。你基本上需要两个面具

  • 一个用于
    NaNs
  • 检查第一行值是否等于列的其余部分
然后用位
链接这两个条件,并检查
所有
行是否满足条件:

m1 = np.isnan(x)
m2 = x[0] == x
x[:, ~(m2|m).all(0)]

array([[ 1.,  2.,  2.,  1.],
       [ 2., nan,  1.,  1.],
       [nan,  1.,  1.,  1.],
       [ 1.,  2., nan,  0.],
       [ 0.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.],
       [nan,  1.,  0.,  2.],
       [ 2.,  1.,  1.,  1.]])
m1 = np.isnan(x)
m2 = x[0] == x
x[:, ~(m2|m).all(0)]

array([[ 1.,  2.,  2.,  1.],
       [ 2., nan,  1.,  1.],
       [nan,  1.,  1.,  1.],
       [ 1.,  2., nan,  0.],
       [ 0.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.],
       [nan,  1.,  0.,  2.],
       [ 2.,  1.,  1.,  1.]])