2012-09-13 49 views
8

Có một cách khác trong NumPy để thực hiện chức năng scipy.stats.mode để có được những giá trị thường gặp nhất trong ndarrays dọc theo trục? (Không nhập khẩu các module khác) tức làThay thế cho chức năng chế độ Scipy trong 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] 

Trả lời

14

Chức năng scipy.stats.mode được định nghĩa với mã này, mà chỉ dựa vào 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 

Nguồn: https://github.com/scipy/scipy/blob/master/scipy/stats/stats.py#L609

0

Nếu bạn biết không có nhiều giá trị khác nhau (tương đối so với kích thước của đầu vào "itemAr ray "), một cái gì đó như thế này có thể hiệu quả:

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)) 
Các vấn đề liên quan