2016-03-11 47 views
0

我有一個數組包含五個不同類別(A-E)中三個不同指標(X-Z)的數據。 現在我想檢查數據集中的每一列是否有0。如果連續有0,我想刪除這種類型的所有指標。如何刪除一個包含零的第n行?

在我的最小的例子中,它應該找到其中一個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的行的距離來選擇要刪除的行。

+1

問題是在刪除功能之前。我認爲j從1到AA.shape [1]從不等於0。你希望AA [i,j] 0 – Glostas

+0

@Glostas,非常感謝你的輸入!儘管我對編碼很陌生,但我應該注意到這一點。但即使有這種適應'如果AA [i,j] == 0.0:'我的刪除功能不起作用。 – Dave

+0

我沒有真正檢查它。在AA中你有字符串,0.0是一個浮點數。這永遠不可能是平等的。嘗試如果AA [i,j]是否爲'0'。作爲一般的提示:使用print('輸入if')或其他東西來檢查代碼是否進入你的if語句 – Glostas

回答

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

非常感謝,這是解決最小例子的好方法。不幸的是,我舉這個例子太簡單了,因爲名字X,Y,Z不完全一樣,但是評價者'X-asdf','X-asd','Xasdf',所以我只知道行I想要完全刪除。不過,我會嘗試是否可以以某種方式存儲索引,然後加上多個距離,因爲我在代碼中使用「序列」嘗試了它。 – Dave

+1

如果可以從實際標籤中系統地提取名稱'X','Y','Z',那麼這對上述內容來說是一個很小的修改。在問題中添加一段來解釋命名 - 例如,第一個字母是否足夠?我知道你的標題是關於刪除每一個第n行,但是我是通過問題文本進行的,因爲如果兩種方法都可行,它會更加健壯。 – alexis

+0

我會嘗試使用標籤的「可提取」部分或其他行計數。只要我成功了,我可以通過檢查你的答案讓你知道。 – Dave

2

您正在試圖刪除的東西,而通過它的循環,它不會工作,因爲它會失去引用。
而不是刪除當前矩陣,嘗試建立另一個與您想要的值,然後將矩陣分配給您剛創建的一個