如何删除一个包含零的每个第n行?

时间:2016-03-11 14:46:56

标签: python arrays numpy

我有一个数组,其中包含五个不同类别(A-E)中三个不同指标(X-Z)的数据。 现在我想检查数据集中的每一列是否有0。如果连续存在0,我想删除此类型的所有指标。

在我的最小例子中,它应该在Y行之一中找到零并因此删除所有Y行。

AA =(['0','A','B','C','D','E'],
     ['X','2','3','3','3','4'],
     ['Y','3','4','9','7','3'],
     ['Z','3','4','6','3','4'],
     ['X','2','3','3','3','4'],
     ['Y','3','4','8','7','0'],
     ['Z','3','4','6','3','4'],
     ['X','2','5','3','3','4'],
     ['Y','3','4','0','7','3'],
     ['Z','3','4','6','3','4']) 

我的代码如下:

    import numpy as np
    sequence = 3 #number of columns per sequence X,Y,Z 

    AA = np.array(AA)  
    for i in range(1,AA.shape[0]):
        for j in range(1,AA.shape[1]):
            if j == 0.0:
                for k in range(np.min((j-1)/sequence,1),AA.shape[0],sequence):                  
                    np.delete(AA, k, 0)      

并且应该给我:

AA =(['0','A','B','C','D','E'],
     ['X','2','3','3','3','4'],
     ['Z','3','4','6','3','4'],
     ['X','2','3','3','3','4'],
     ['Z','3','4','6','3','4'],
     ['X','2','5','3','3','4'],
     ['Z','3','4','6','3','4']) 

但不知何故,我的代码不会删除任何内容。所以我想我的删除功能有问题,但我无法弄清楚究竟是什么问题。

编辑: 在我的真实数据中,指标(X-Z)并不具有完全相同的名称,而是“asdf - X”或“qwer - Y - asdf”。因此,第一个' - '分隔符之后的标签部分始终是相同的。

所以我不能对它们使用set()函数,而是必须通过距检测到0的行的距离来选择要删除的行。

2 个答案:

答案 0 :(得分:4)

我会两次通过。它更清洁,在某些情况下甚至可能更快。这是一个没有numpy的实现;随意将其转换为使用array()

AA =(['0','A','B','C','D','E'],
     ['X','2','3','3','3','4'],
     ['Y','3','4','9','7','3'],
     ['Z','3','4','6','3','4'],
     ['X','2','3','3','3','4'],
     ['Y','3','4','8','7','0'],
     ['Z','3','4','6','3','4'],
     ['X','2','5','3','3','4'],
     ['Y','3','4','0','7','3'],
     ['Z','3','4','6','3','4']) 

todrop = set(row[0] for row in AA[1:] if '0' in row)
filtered = list(row for row in AA[1:] if row[0] not in todrop)

由于row[0]不包含确切的指标标签,因此请编写一个简单的函数来提取标签并使用该标签而不是整个row[0]。详细信息取决于您的数据实际的外观。

选项2:如果确实想要通过计算行来实现它(我不建议这样做):保存模数为3的行号,而不是行ID。它的工作量相同:

relabeled = list((n % 3, row) for n, row in enumerate(AA[1:]))
todrop = set(n for n, row in relabeled if '0' in row)  # Will save {1} for Y
filtered = list(row for n, row in relabeled if n not in todrop)

答案 1 :(得分:2)

你试图在循环中删除某些东西,但它不起作用,因为它会丢失引用。
不要删除当前矩阵,而是尝试使用您想要的值构建另一个矩阵,然后将矩阵分配给刚刚创建的矩阵