2017-04-14 134 views
0

我需要計算唯一值的頻率在numpy的矩陣所以首先我用我自己的方法如下:頻率計數

mat = np.matrix([[1, 2], [3, 4],..]) 
dic = {} 
for i in mat: 
    for j in i: 
     if j in dic: 
     dic[j] += 1 
     else: 
     dic[j] = 0 

但這種方法是高階昂貴矩陣,例如1000X1000的時間,所以爲了減少我嘗試使用numpy.bincount但我得到了ValueError。 有沒有更好的方法獲得矩陣中的值的頻率計數?在此先感謝。

+0

你得到一個'ValueError異常,如果輸入不是一維的,或包含負值元素,或者是MINLENGTH非positive'(來自網站)。確保你的數組很好。 – TheChetan

+0

輸入不是一維 – flamelite

+0

再次'如果輸入不是一維'ValueError' – TheChetan

回答

3

假設矩陣中的所有值都是非負的,你可以將矩陣轉換爲numpy的陣列,然後bincount使用:

np.bincount(np.array(mat).reshape(1,mat.size)[0]) 
+0

謝謝兄弟。有效 – flamelite

1

你得到ValueError: object too deep for desired array的np.bincount?它不能超過一維數組處理( 「參數:x:array_like,一個維,非負整數」)

嘗試np.bincount(mat.flatten())

3

考慮矩陣mat

mat = np.matrix(np.random.randint(10, size=(20, 20))) 
print(mat) 

[[6 3 5 8 8 2 5 0 7 8 0 0 1 8 7 7 5 6 2 3] 
[0 1 8 0 2 3 6 8 8 5 8 7 3 0 5 1 5 3 8 3] 
[3 8 0 3 5 5 8 1 9 1 0 7 9 4 6 1 8 8 1 8] 
[7 1 3 0 9 1 8 7 0 5 6 7 4 4 8 2 5 8 0 7] 
[9 7 8 4 1 7 3 8 6 1 2 1 6 4 1 2 5 5 9 1] 
[1 2 3 9 4 6 6 6 2 9 9 3 4 3 7 3 0 3 9 4] 
[9 4 0 1 2 7 1 4 2 3 4 1 3 8 4 7 7 2 3 5] 
[4 5 7 0 9 3 9 7 4 2 8 6 1 2 0 7 3 5 9 7] 
[2 0 7 6 3 3 0 0 2 9 1 3 5 8 4 9 1 9 1 1] 
[5 9 9 0 0 9 1 9 6 0 1 7 0 6 7 3 1 2 4 6] 
[0 1 6 8 6 8 6 3 2 9 6 1 2 7 8 4 9 7 2 9] 
[1 4 4 3 6 6 5 9 1 1 1 3 0 4 3 8 0 8 3 4] 
[9 1 5 9 0 6 6 1 6 9 4 8 9 0 6 1 9 6 8 3] 
[3 9 8 1 2 3 3 5 0 1 1 1 0 6 8 9 5 7 4 2] 
[5 5 5 4 6 4 6 0 6 3 5 5 3 4 0 6 8 6 3 6] 
[5 4 9 5 5 6 8 7 0 3 7 2 2 6 0 4 2 8 4 7] 
[5 8 6 3 6 4 8 5 7 6 6 2 3 6 6 8 5 5 4 0] 
[7 0 8 0 2 0 1 9 2 0 9 9 3 0 7 8 4 4 6 4] 
[8 6 0 9 3 1 3 2 5 6 9 1 9 1 3 2 9 1 1 2] 
[9 4 0 6 2 0 4 0 9 7 4 8 7 2 1 5 3 5 3 2]] 

你可以將mat轉換爲numpy陣列並使用np.unique,您可以在其中使用參數return_counts=True獲取相應唯一值的計數陣列

u, c = np.unique(np.array(mat), return_counts=True) 

u具有獨特的價值,並c具有計數

print(np.stack([u, c]).T) 

[[ 0 43] 
[ 1 46] 
[ 2 33] 
[ 3 45] 
[ 4 37] 
[ 5 36] 
[ 6 45] 
[ 7 33] 
[ 8 41] 
[ 9 41]]