在Python中从多维数组删除行

时间:2018-12-21 16:06:02

标签: python numpy numpy-ndarray

我正在尝试按照某些条件删除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列。用户将能够决定要删除哪些列。

3 个答案:

答案 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)]