2012-09-13 23 views
8

¿Hay otra manera en numpy para realizar la función de scipy.stats.mode para obtener los valores más frecuentes en ndarrays lo largo del eje? (Sin importar otros módulos), es decir¿Función alternativa al modo Scipy en Numpy?

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] 

Respuesta

14

La función scipy.stats.mode se define con este código, que sólo se basa en 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 

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

0

Si sabe que no hay muchos valores diferentes (en relación con el tamaño de la entrada "itemAr rayo "), algo como esto podría ser eficiente:

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)) 
Cuestiones relacionadas