2017-05-09 56 views
2

我有一個表單的二維數組:np.zeros((m,n))。 我的目標是查看前2列,我想找到發生最多的第一列中的元素(所以第一列的模式),但是如果第二列不想計算兩次是一樣的。計算數組中的條件事件

5X3例如:

[[1 2 x], [1 2 y], [1 3 z], [5 3 w], [5 6 v], [9 2 x], [9 2 y],] 

希望的輸出,即出現次數:

[1]: 2 
[5]: 2 
[9]: 1 

因此,在某種程度上它是一個計數器的功能,但第二陣列上的條件(第2欄) 。

我對Python比較新,是否有一個函數可以直接並且有效地執行此操作?我需要在非常大的矩陣上運行它,但找不到這樣的功能。

+0

所以,你要在第一兩列進行搜索,只有數得過來如果它們是獨特的。關閉我的頭頂部:您可以嘗試按第一列對數組進行排序,然後檢查第一個和第二個項目是否與上一個項目相同,是否將計數器加1,如果不打印第一個項目,然後它發現了多少。 –

+0

問題是我需要對第一列進行排序,然後對第二列中對應於第一列中相同值的段進行排序,最後我將不得不循環遍歷第二列 –

+0

是的,我的錯誤。我認爲你可以用一次運行排序前兩列。你必須把'[1 2 x]'看作一個'12',所以它會在'[1 0 z]'之後。然後你算了。 –

回答

2

這funciotn解決您的問題。

def count_special(arr): 
    counter = {} 
    for i in np.unique(arr[:,0]): 
     sec = arr[arr[:,0]==i,1] 
     counter[i] = len(np.unique(sec)) 
    return counter 

它,您的輸入,返回:

arr = np.array([[1,2,0],[1,2,4],[1,3,4],[5,3,1],[5,6,0]]) 
print(count_special(arr)) 

- > {1:2,5:2}