我正在尝试按照某些条件删除numpy数组中的特定行。
这是一个示例:
a = np.array ([[1,1,0,0,1],
[0,0,1,1,1],
[0,1,0,1,1],
[1,0,1,0,1],
[0,0,1,0,1],
[1,0,1,0,0]])
我希望能够删除所有行,其中特定列为零,此数组可能更大。 在此示例中,如果前两个元素为零,或者后两个元素为零,则将删除行。
它可以是任何组合,不仅可以是第一个元素或最后一个元素。
这应该是最终的:
a = np.array ([[1,1,0,0,1],
[0,1,0,1,1],
[1,0,1,0,1]])
例如,如果我尝试:
a[:,0:2] == 0
阅读后:
但是它们似乎不适用于我的案子,或者可能因为我的案子无济于事,所以我在这里不太了解。
这为我提供了所有行,其中前两种情况均为零,即True,True
array([[False, False],
[ True, True],
[ True, False],
[False, True],
[ True, True],
[False, True]])
,并且对于最后两列为零,也应删除最后一行。所以最后我只剩下两行。
a[:,3:5] == 0
array([[ True, False],
[False, False],
[False, False],
[ True, False],
[ True, False],
[ True, True]])
我正在尝试类似的操作,但是我现在不明白如何告诉它只给我提供符合条件的行,尽管这仅仅是:
(a[a[:,0:2]] == 0).all(axis=1)
array([[ True, True, False, False, False],
[False, False, True, True, False],
[False, False, False, False, False],
[False, False, False, False, False],
[False, False, True, True, False],
[False, False, False, False, False]])
(a[((a[:,0])& (a[:,1])) ] == 0).all(axis=1)
这将所有内容显示为False
能不能给我一些指导? 谢谢
只需添加一个问题,即它不会始终是前2或后2的情况。如果我的矩阵有35列,则可能是第6至10列,然后是第20和25列。用户将能够决定要删除哪些列。
答案 0 :(得分:2)
尝试一下
idx0 = (a[:,0:2] == 0).all(axis=1)
idx1 = (a[:,-2:] == 0).all(axis=1)
a[~(idx0 | idx1)]
前两个步骤选择与您的过滤条件匹配的行的索引。然后执行或(|
)操作,然后执行 not (~
)操作以获得所需的最终索引。
答案 1 :(得分:0)
如果我正确理解,您可以执行以下操作:
import numpy as np
a = np.array([[1, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 1, 1],
[1, 0, 1, 0, 1],
[0, 0, 1, 0, 1],
[1, 0, 1, 0, 0]])
left = np.count_nonzero(a[:, :2], axis=1) != 0
a = a[left]
right = np.count_nonzero(a[:, -2:], axis=1) != 0
a = a[right]
print(a)
输出
[[1 1 0 0 1]
[0 1 0 1 1]
[1 0 1 0 1]]
或者,简称:
left = np.count_nonzero(a[:, :2], axis=1) != 0
right = np.count_nonzero(a[:, -2:], axis=1) != 0
a = a[(left & right)]
答案 2 :(得分:0)
使用以下遮罩:
from collections import defaultdict
name_list = ["David Joyner", "David Zuber", "Brenton Joyner",
"Brenton Zuber", "Nicol Barthel", "Shelba Barthel",
"Shelba Crowley", "Shelba Fernald", "Shelba Odle",
"Shelba Fry", "Maren Fry"]
name_dict = defaultdict(list)
for first_name in set([name.split()[0] for name in name_list]):
name_dict[first_name] = [name for name in name_list if name.split()[0] == first_name]
print(name_dict)
#defaultdict(<class 'list'>, {'Maren': ['Maren Fry'], 'David': ['David Joyner', 'David Zuber'], 'Nicol': ['Nicol Barthel'], 'Shelba': ['Shelba Barthel', 'Shelba Crowley', 'Shelba Fernald', 'Shelba Odle', 'Shelba Fry'], 'Brenton': ['Brenton Joyner', 'Brenton Zuber']})
如果要创建过滤视图:
[np.any(a[:,:2], axis=1) & np.any(a[:,:-2], axis=1)]
如果要创建新数组:
a[np.any(a[:,:2], axis=1) & np.any(a[:,:-2], axis=1)]