我要删除特定列的值为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]]
答案 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]]