2016-08-22 7 views
5

गिनती है मैं एक बड़े मैट्रिक्स को विभाजित करने के बाद सामना करने वाले बराबर मैट्रिस की संख्या गिनना चाहता हूं।numpy - बराबर एरे

mat1 = np.zeros((4, 8)) 

split4x4 = np.split(mat1, 4) 

अब मुझे पता है कि कितने बराबर मैट्रिक्स split4x4 में हैं चाहते हैं, लेकिन collections.Counter(split4x4) एक त्रुटि फेंकता है। क्या ऐसा करने के लिए numpy में एक अंतर्निहित तरीका है?

+0

प्रेरित मैं एक शौकिया हूँ तो यह मूर्खतापूर्ण लग सकता है, लेकिन np.split() डिफ़ॉल्ट रूप से बराबर टुकड़ों में सरणी है कि आप उदाहरण के लिए निर्दिष्ट (बंट जाएगा: उपर्युक्त उदाहरण में 4) और यदि यह इससे कोई त्रुटि नहीं फेंकता है। तो, आपको उस जानकारी को खोजने की आवश्यकता क्यों है, क्या वह सिर्फ 4 नहीं होगा? –

उत्तर

1

यह numpy_indexed पैकेज का उपयोग एक पूरी तरह से vectorized तरीके से किया जा सकता है (अस्वीकरण: मैं उसके लेखक हूँ):

import numpy_indexed as npi 
unique_rows, row_counts = npi.count(mat1) 

यह काफी हद तक तेजी से collections.Counter का उपयोग करने से होना चाहिए।

1

शायद सबसे आसान तरीका है np.unique उपयोग करने के लिए और उन्हें टपल के रूप में तुलना करने के लिए विभाजन सरणियों समतल है:

import numpy as np 
# Generate some sample data: 
a = np.random.uniform(size=(8,3)) 
# With repetition: 
a = np.r_[a,a] 
# Split a in 4 arrays 
s = np.asarray(np.split(a, 4)) 
s = [tuple(e.flatten()) for e in s] 
np.unique(s, return_counts=True) 

टिप्पणी: return_countsnp.unique संस्करण 1.9.0 में नए के तर्क।

एक अन्य शुद्ध numpy समाधान से that post

# Generate some sample data: 
In: a = np.random.uniform(size=(8,3)) 
# With some repetition 
In: a = r_[a,a] 
In: a.shape 
Out: (16,3) 
# Split a in 4 arrays 
In: s = np.asarray(np.split(a, 4)) 
In: print s 
Out: [[[ 0.78284847 0.28883662 0.53369866] 
     [ 0.48249722 0.02922249 0.0355066 ] 
     [ 0.05346797 0.35640319 0.91879326] 
     [ 0.1645498 0.15131476 0.1717498 ]] 

     [[ 0.98696629 0.8102581 0.84696276] 
     [ 0.12612661 0.45144896 0.34802173] 
     [ 0.33667377 0.79371788 0.81511075] 
     [ 0.81892789 0.41917167 0.81450135]] 

     [[ 0.78284847 0.28883662 0.53369866] 
     [ 0.48249722 0.02922249 0.0355066 ] 
     [ 0.05346797 0.35640319 0.91879326] 
     [ 0.1645498 0.15131476 0.1717498 ]] 

     [[ 0.98696629 0.8102581 0.84696276] 
     [ 0.12612661 0.45144896 0.34802173] 
     [ 0.33667377 0.79371788 0.81511075] 
     [ 0.81892789 0.41917167 0.81450135]]] 
In: s.shape 
Out: (4, 4, 3) 
# Flatten the array: 
In: s = asarray([e.flatten() for e in s]) 
In: s.shape 
Out: (4, 12) 
# Sort the rows using lexsort: 
In: idx = np.lexsort(s.T) 
In: s_sorted = s[idx] 
# Create a mask to get unique rows 
In: row_mask = np.append([True],np.any(np.diff(s_sorted,axis=0),1)) 
# Get unique rows: 
In: out = s_sorted[row_mask] 
# and count: 
In: for e in out: 
     count = (e == s).all(axis=1).sum() 
     print e.reshape(4,3), count 
Out:[[ 0.78284847 0.28883662 0.53369866] 
    [ 0.48249722 0.02922249 0.0355066 ] 
    [ 0.05346797 0.35640319 0.91879326] 
    [ 0.1645498 0.15131476 0.1717498 ]] 2 
    [[ 0.98696629 0.8102581 0.84696276] 
    [ 0.12612661 0.45144896 0.34802173] 
    [ 0.33667377 0.79371788 0.81511075] 
    [ 0.81892789 0.41917167 0.81450135]] 2 
+0

क्या आप पहले उदाहरण में पायथन 3 का उपयोग कर रहे हैं? क्योंकि मैं 'ए = आर_ [ए, ए] ' ' नाम त्रुटि: नाम 'आर_' परिभाषित नहीं किया गया है ' – andandandand

+0

@andandandand नहीं, मैं नहीं करता हूं। यह मेरी गलती है, मैं 'r_' से पहले 'np' भूल गया जो कि सरणी को जल्दी से बनाने का एक आसान तरीका है (देखें: http://docs.scipy.org/doc/numpy/reference/generated/numpy.r_ .html)। मैंने अभी अपना जवाब सही कर दिया है। – bougui