2012-09-06 18 views
16

मेरे पास आकार (30,480,640) के आकार के साथ एक numpy ndarray है, 1 वें और 2 वें धुरी स्थानों (अक्षांश और लम्बाई) का प्रतिनिधित्व करते हैं, 0 वें धुरी में वास्तविक डेटा बिंदु होते हैं। मैं प्रत्येक स्थान पर 0 वें धुरी के साथ सबसे अधिक लगातार मूल्य का उपयोग करना चाहता हूंnumpy ndarray में सबसे अधिक लगातार मूल्यों को कैसे ढूंढें?

>>> data 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]], 

     [[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]], 

     [[40, 40, 42, 43, 44], 
     [45, 46, 47, 48, 49], 
     [50, 51, 52, 53, 54], 
     [55, 56, 57, 58, 59]]]) 

(perform calculation) 

>>> new_data 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]]) 

डेटा बिंदुओं negtive और सकारात्मक चल संख्या में शामिल होंगे: है, जो (1,480,640) .ie के आकार के साथ एक नई सरणी के निर्माण के लिए है। मैं ऐसी गणना कैसे कर सकता हूं? आपका बहुत बहुत धन्यवाद!

मैंने numpy.unique के साथ प्रयास किया, लेकिन मुझे "TypeError: unique() को एक अप्रत्याशित कीवर्ड तर्क 'return_inverse' मिला।" मैं यूनिक्स पर स्थापित numpy संस्करण 1.2.1 का उपयोग कर रहा हूं और यह return_inverse का समर्थन नहीं करता है। मैंने मोड की भी कोशिश की, लेकिन यह इतनी बड़ी मात्रा में डेटा संसाधित करने के लिए हमेशा के लिए लेता है ... तो क्या सबसे अधिक मूल्य प्राप्त करने का कोई वैकल्पिक तरीका है? एक बार फिर धन्यवाद।

+2

प्रभावी मूल्य से आपका क्या मतलब है? मैं सवाल समझ में नहीं आता। –

+0

मैं @HenryGomersall द्वारा टिप्पणी को दूसरी बार दूंगा - मेरे पास स्कूबी नहीं है कि आपका प्रश्न क्या है ... –

+0

आपके भ्रम के लिए खेद है ... मेरा मतलब सबसे अधिक मूल्यवान मूल्य है .. – oops

उत्तर

14

एक फ्लैट सरणी के सबसे लगातार मूल्य मिल जाए, का उपयोग unique, bincount और argmax करने के लिए:

arr = np.array([5, 4, -2, 1, -2, 0, 4, 4, -6, -1]) 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.bincount(indices))] 

एक बहुआयामी सरणी के साथ काम करने के लिए, हम की जरूरत नहीं है के बारे में चिंता करने की unique, लेकिन हम क्या ज़रूरत है bincount पर apply_along_axis उपयोग करने के लिए:

arr = np.array([[5, 4, -2, 1, -2, 0, 4, 4, -6, -1], 
       [0, 1, 2, 2, 3, 4, 5, 6, 7, 8]]) 
axis = 1 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape), 
           None, np.max(indices) + 1), axis=axis)] 

अपने डेटा के साथ:

data = np.array([ 
    [[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19]], 

    [[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19]], 

    [[40, 40, 42, 43, 44], 
    [45, 46, 47, 48, 49], 
    [50, 51, 52, 53, 54], 
    [55, 56, 57, 58, 59]]]) 
axis = 0 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape), 
           None, np.max(indices) + 1), axis=axis)] 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

NumPy 1.2, वास्तव में? आप यथोचित कुशलतापूर्वक np.searchsorted का उपयोग कर np.unique(return_inverse=True) अनुमान लगा सकता है (यह एक अतिरिक्त ओ (n लॉग n) है, तो प्रदर्शन में काफी परिवर्तन नहीं होना चाहिए):

u = np.unique(arr) 
indices = np.searchsorted(u, arr.flat) 
+0

ने इसे आजमाया नहीं है लेकिन धन्यवाद बहुत! – oops

+0

@ ecatmur, मैं numpy संस्करण 1.2.1 का उपयोग कर रहा हूँ और यह np.unique (return_inverse) का समर्थन नहीं करता .. कोई सुझाव? – oops

+0

@oops ऊपर देखें, आपको इसे स्वयं परीक्षण करना होगा क्योंकि मुझे नहीं पता कि मुझे numpy का पुराना संस्करण कहां मिलेगा;) – ecatmur

0

flatten अपनी सरणी, फिर से collections.Counter बनाएं। सामान्य रूप से, फ़्लोटिंग-पॉइंट संख्याओं की तुलना करते समय विशेष देखभाल करें।

4

उपयोग SciPy के मोड समारोह:

import numpy as np 
from scipy.stats import mode 

data = np.array([[[ 0, 1, 2, 3, 4], 
        [ 5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19]], 

       [[ 0, 1, 2, 3, 4], 
        [ 5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19]], 

       [[40, 40, 42, 43, 44], 
        [45, 46, 47, 48, 49], 
        [50, 51, 52, 53, 54], 
        [55, 56, 57, 58, 59]]]) 

print data 

# find mode along the zero-th axis; the return value is a tuple of the 
# modes and their counts. 
print mode(data, axis=0) 
+0

धन्यवाद टैरो सातो, लेकिन बड़े सरणी को संसाधित करने में बहुत लंबा समय लगता है .. इसे तेज करने के लिए कोई सुझाव? – oops

+0

ठीक है, मैंने देखा है कि आप इसे फ्लोट के साथ करना चाहते हैं। ऐसा करने के लिए, मुझे लगता है कि आपको थोड़ा अलग दृष्टिकोण चाहिए, क्योंकि वास्तव में यह पूछने में कोई फर्क नहीं पड़ता कि सबसे तेज़ फ्लोट क्या है, क्योंकि केवल दो छोटे फ्लोट दोहराए गए प्रयोगों से मेल खाते हैं। क्या आपको वास्तव में ऐसी अजीब चीज खोजने की ज़रूरत है? मैं आपको अपने नमूने का वितरण (मोटे तौर पर) जानता हूं, फिर आपके नमूने में सबसे अधिक संभावित संख्या का पता लगाने के लिए गणना करने के लिए बेहतर उपाय हैं, जैसे माध्य और औसत। –

+0

क्या लोग अभी भी व्यापक रूप से इस्तेमाल किए गए scipy पैकेज करते हैं? सिस्को से निकलने का मतलब कहीं भी पढ़ा गया है।बस जानने के लिए उत्सुक :) –

संबंधित मुद्दे