2013-07-23 64 views
2

我有一個形狀爲1001,2663的numpy數組。數組包含12和127的值,現在我想計算一個特定值的數量,在這種情況下12.所以我嘗試使用bincount,但這很奇怪。見我得到什麼:如何獲得一個numpy數組中的特定值的頻率

>>> x.shape 
(1001, 2663) 
>>> np.bincount(x) 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
ValueError: object too deep for desired array 
>>> y = np.reshape(x, 2665663) 
>>> y.shape 
(2665663,) 
>>> np.bincount(y) 
array([  0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0, 529750,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0,  0,  0,  0,  0,  0,  0, 
      0, 2135913]) 
>>> np.nonzero(np.bincount(y)) 
(array([ 12, 127]),) 

值529750可能是值的頻率12和2135913可能的值127的頻率,但它不會告訴我這一點。矩陣的形狀也很奇怪。

如果我嘗試哪裏還不會給我正確的價值總和:

>>> np.sum(np.where(x==12)) 
907804649 

我沒辦法了:這麼著名的親愛的用途,如何讓一個特定值的頻率在numpy的矩陣?

EDIT

較小例子。但仍然得到我不瞭解的結果。爲什麼是零?

>>> m = np.array([[1,1,2],[2,1,1],[2,1,2]]) 
>>> np.bincount(m) 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
ValueError: object too deep for desired array 
>>> n = np.reshape(m, 9) 
>>> n 
array([1, 1, 2, 2, 1, 1, 2, 1, 2]) 
>>> np.bincount(n) 
array([0, 5, 4]) 

我想我明白了。 [0,5,4]中的零表示矩陣中不存在0值。所以在我的實際情況中,529750是矩陣中的第12個值,矩陣值0-11全部爲'0',比得到很多0值(值13-126),然後值127給出2135913的頻率。但是如何獲得頻率作爲一個特定的數字在一個numpy數組中的單個值?

+0

我建議用較小的(可行用手)例如,試圖瞭解發生了什麼。 – hivert

回答

2

你想在你的data數組中發生一個簡單的number的數量?嘗試

np.bincount(data)[number] 
+0

我自己也發現了。感謝您的答覆!但是這需要我先將矩陣重塑爲一維數組。當然這沒有問題。只要我的電腦必須做,而不是我。 – Mattijn

1

bincount返回一個數組,其中的x頻率爲bincount[x],它需要一個平坦的輸入,這樣就可以使用bincount(array.ravel())辦案時array可能並不平坦。

如果陣列只有幾個唯一值,即2和127,它可能是值得減少使用獨特的陣列之前調用bincount即:

import numpy as np 
def frequency(array): 
    values, array = np.unique(array, return_inverse=True) 
    return values, bincount(array.ravel()) 

array = np.array([[2, 2, 2], 
        [127, 127, 127], 
        [2, 2, 2]]) 
frequency(array) 
# array([ 2, 127]), array([6, 3]) 

最後,你可以做

np.sum(array == 12) 

注意array == 12np.where(array == 12)之間的區別:

array = np.array([12, 0, 0, 12]) 
array == 12 
# array([ True, False, False, True], dtype=bool) 
np.where(array == 12) 
#(array([0, 3]),) 

清楚地總結第二個是不會給你你想要的。

0

您可以使用來自collections模塊的'Counter'。

from collections import Counter 
import numpy as np 
my_array=np.asarray(10*np.random.random((10,10)),'int') 
my_dict=Counter() 
print '\n The Original array \n ', my_array 

for i in my_array: 
    my_dict=my_dict+Counter(i) 

print '\n The Counts \n', my_dict 

的O/P是這樣

原始數組 [[6 8 3 7 6 9 2 2 3 2] [7 0 1 1 8 0 8 2 6 3] [ 0 4 0 1 8 7 6 1 1 1] [9 2 9 2 5 9 9 6 6 7] [5 1 1 0 3 0 2 7 6 2] [6 5 9 6 4 7 5 4 8 0] [0 7 1 6 1 2 7 8 4 1] [0 8 6 7 1 7 3 3 8] 8]]

計數器({6:15,1:14,7:14,8:12,0:11,2:10,3:8,5:6,9:6,4:4})計數器

你可以嘗試most_common()方法如果你想有一個特定元素的出現正好訪問就像字典這給最常見的條目 。

例:my_dict [6]會給上面的代碼

相關問題