删除列中具有特定值的行

时间:2019-05-14 17:25:07

标签: python arrays numpy

我要删除特定列的值为1的所有行

例如,考虑以下列表:

x=[[1,0,0,0],[0,1,0,0],[0,0,0,1],[0,0,1,0],[1,0,0,0],[0,1,0,0],[0,0,0,1],[0,0,1,0]]

我想删除第一和第三列上有一个的行。所以我的预期输出是,

x=[[0,1,0,0],[0,0,0,1],[0,1,0,0],[0,0,0,1]]

2 个答案:

答案 0 :(得分:0)

x=[[1,0,0,0],[0,1,0,0],[0,0,0,1],[0,0,1,0],[1,0,0,0],[0,1,0,0],[0,0,0,1],[0,0,1,0]]

y = [l for l in x if l[0] != 1 and l[2] != 1]
print(y)

输出

[[0, 1, 0, 0], [0, 0, 0, 1], [0, 1, 0, 0], [0, 0, 0, 1]]

答案 1 :(得分:0)

列表:

In [33]: x=[[1,0,0,0],[0,1,0,0],[0,0,0,1],[0,0,1,0],[1,0,0,0],[0,1,0,0],[0,0,0,1
    ...: ],[0,0,1,0]]                                                           

等效数组:

In [34]: arr = np.array(x)                                                      
In [35]: arr                                                                    
Out[35]: 
array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 1, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 1, 0]])

测试列:

In [36]: arr[:,[0,2]]                                                           
Out[36]: 
array([[1, 0],
       [0, 0],
       [0, 0],
       [0, 1],
       [1, 0],
       [0, 0],
       [0, 0],
       [0, 1]])

掩码标识在其中任一列中具有1的行:

In [37]: arr[:,[0,2]].any(axis=1)                                               
Out[37]: array([ True, False, False,  True,  True, False, False,  True])

应用该掩码删除行;同样,保留其他行:

In [38]: arr[~_, :]                                                             
Out[38]: 
array([[0, 1, 0, 0],
       [0, 0, 0, 1],
       [0, 1, 0, 0],
       [0, 0, 0, 1]])

arr未被更改;这是一个新数组。

通常的想法是构造一个掩码或布尔数组,以标识要保留的元素,并使用其创建一个新数组。

在原始列表上使用列表理解:

In [45]: [row for row in x if not any(row[j] for j in [0,2])]                   
Out[45]: [[0, 1, 0, 0], [0, 0, 0, 1], [0, 1, 0, 0], [0, 0, 0, 1]]