问题描述
我有一个numpy数组,我需要从中删除非缺失单元格具有相同值的列,并删除所有值都缺失的列。 数组:
>>> x = np.array([[ 1.,2.,np.NaN,1.],[ 2.,1.,[np.NaN,[ 1.,0.],[ 0.,0.,2.],1.]])
>>> x
array([[ 1.,nan,[nan,1.]])
我可以删除缺少所有值的列(列索引3)
>>> x[:,~np.all(np.isnan(x),axis=0)]
array([[ 1.,1.]])
我可以删除所有行中具有相同值的所有列(列索引4)
>>> x[:,~np.all(x[1:] == x[:-1],1.]])
但是,如何删除非缺失值相同的第6列(索引5),但是缺失值的存在会导致布尔检查混乱?
编辑:所需结果
array([[ 1.,1.]])
解决方法
您可以使用按位运算符链接多个蒙版。您基本上需要两个口罩。
- 一个
NaNs
- 检查第一行的值是否等于列的其余部分
然后用按位的OR
链接两个条件,并检查all
行是否满足条件:
m1 = np.isnan(x)
m2 = x[0] == x
x[:,~(m2|m).all(0)]
array([[ 1.,2.,1.],[ 2.,nan,1.,[nan,[ 1.,0.],[ 0.,0.,2.],1.]])