2012-09-13 9 views
8

は軸に沿ってndarraysの中で最も頻度の高い値を得るためにscipy.stats.mode機能を実現するためにnumpyの中の別の方法はありますか?(他のモジュールをインポートせず)、すなわちNumpyのScipyモード機能の代わりに?

import numpy as np 
from scipy.stats import mode 

a = 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]]]) 

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

答えて

14

scipy.stats.mode関数は、このコードで定義され、これだけnumpyのに依存しています:

def mode(a, axis=0): 
    scores = np.unique(np.ravel(a))  # get ALL unique values 
    testshape = list(a.shape) 
    testshape[axis] = 1 
    oldmostfreq = np.zeros(testshape) 
    oldcounts = np.zeros(testshape) 

    for score in scores: 
     template = (a == score) 
     counts = np.expand_dims(np.sum(template, axis),axis) 
     mostfrequent = np.where(counts > oldcounts, score, oldmostfreq) 
     oldcounts = np.maximum(counts, oldcounts) 
     oldmostfreq = mostfrequent 

    return mostfrequent, oldcounts 

出典:https://github.com/scipy/scipy/blob/master/scipy/stats/stats.py#L609

0

をご入力の大きさに比べて、多くの異なる値が(存在しないことを知っている場合は、「itemArをray ")、このようなものは効率的です:

uniqueValues = np.unique(itemArray).tolist() 
uniqueCounts = [len(np.nonzero(itemArray == uv)[0]) 
       for uv in uniqueValues] 

modeIdx = uniqueCounts.index(max(uniqueCounts)) 
mode = itemArray[modeIdx] 

# All counts as a map 
valueToCountMap = dict(zip(uniqueValues, uniqueCounts)) 
関連する問題