2015-12-12 15 views
5

में स्तंभों की घटनाओं की गणना करना 2 x डी आयामी numpy सरणी एम को देखते हुए, मैं एम के प्रत्येक कॉलम के अवसरों की संख्या गिनना चाहता हूं। यानी, मैं bincount का सामान्य संस्करण ढूंढ रहा हूं।numpy array

मैंने अभी तक क्या प्रयास किया है: (1) परिवर्तित कॉलम tuples (2) हैशड tuples (hash के माध्यम से) प्राकृतिक संख्याओं (3) numpy.bincount इस्तेमाल किया।

यह बदसूरत लगता है। क्या कोई और अधिक सुरुचिपूर्ण और कुशल तरीके से अवगत है?

+0

दिलचस्प सवाल है। किसी भी समाधान को देखने के लिए तत्पर हैं क्योंकि मेरा पहला और एकमात्र विचार बिल्कुल वैसा ही था जो आपने किया था। – Reti43

+0

तो आप अद्वितीय कॉलम और उनकी गणना की एक सूची की उम्मीद कर रहे हैं? क्या स्तंभों का क्रम संरक्षित किया जाना चाहिए? – imp9

+0

कृपया अपने प्रयासों का कोड दिखाएं। –

उत्तर

4

आप collections.Counter उपयोग कर सकते हैं:

>>> import numpy as np 
>>> a = np.array([[ 0, 1, 2, 4, 5, 1, 2, 3], 
...    [ 4, 5, 6, 8, 9, 5, 6, 7], 
...    [ 8, 9, 10, 12, 13, 9, 10, 11]]) 
>>> from collections import Counter 
>>> Counter(map(tuple, a.T)) 
Counter({(2, 6, 10): 2, (1, 5, 9): 2, (4, 8, 12): 1, (5, 9, 13): 1, (3, 7, 11): 
1, (0, 4, 8): 1}) 
1

को देखते हुए:

a = np.array([[ 0, 1, 2, 4, 5, 1, 2, 3], 
       [ 4, 5, 6, 8, 9, 5, 6, 7], 
       [ 8, 9, 10, 12, 13, 9, 10, 11]]) 
b = np.transpose(a) 
  1. hashing से एक अधिक कुशल समाधान (अब भी हेरफेर की आवश्यकता है):

    मैं लचीला डेटा प्रकार np.void के साथ सरणी के एक दृश्य बनाने के (देखें here) इस तरह के कि प्रत्येक पंक्ति एक तत्व बन जाती है। इस आकार में कनवर्ट करने से np.unique पर इसे संचालित करने की अनुमति मिल जाएगी।

    %%timeit  
    c = np.ascontiguousarray(b).view(np.dtype((np.void, b.dtype.itemsize*b.shape[1]))) 
    _, index, counts = np.unique(c, return_index = True, return_counts = True) 
    #counts are in the last column, remember original array is transposed 
    >>>np.concatenate((b[idx], cnt[:, None]), axis = 1) 
    array([[ 0, 4, 8, 1], 
         [ 1, 5, 9, 2], 
         [ 2, 6, 10, 2], 
         [ 3, 7, 11, 1], 
         [ 4, 8, 12, 1], 
         [ 5, 9, 13, 1]]) 
    10000 loops, best of 3: 65.4 µs per loop 
    

    मायने रखता है a की अद्वितीय स्तंभों के साथ जोड़ दिया।

  2. आपका हैशिंग समाधान।

    %%timeit 
    array_hash = [hash(tuple(row)) for row in b] 
    uniq, index, counts = np.unique(array_hash, return_index= True, return_counts = True) 
    np.concatenate((b[idx], cnt[:, None]), axis = 1) 
    10000 loops, best of 3: 89.5 µs per loop 
    

अद्यतन: इफिसियों के समाधान के लिए सबसे कुशल और सुरुचिपूर्ण है।

%%timeit 
Counter(map(tuple, a.T)) 
10000 loops, best of 3: 38.3 µs per loop