2015-07-22 3 views
-1

Я попытался использовать режим scipy.stats, чтобы найти наиболее распространенное значение. Однако моя матрица содержит много нулей, и поэтому это всегда режим.Как найти второе наиболее часто встречающееся число в массиве?

Например, если моя матрица выглядит следующим образом:

array = np.array([[0, 0, 3, 2, 0, 0], 
      [5, 2, 1, 2, 6, 7], 
      [0, 0, 2, 4, 0, 0]]) 

Я хотел бы иметь значение 2 возвращается.

+0

Итак, что произошло, когда вы использовали 'scipy.stats'? Также это не допустимый список или массив python !! – Kasramvd

+0

Если вы не хотите включать 0, отфильтруйте его из данных, а затем получите статистику результата. – Barmar

+0

'{...}' - это обозначение для 'set', а не' list', в котором используется обозначение '[...]' (в Python нет такой вещи, как 'array'). У 'set' будет только один раз каждый элемент, так что в нем не будет« второго наиболее общего числа ». Кроме того, вам не хватает запятых между элементами в вашем наборе, поэтому написанное вами даже не является допустимым Python. – ArtOfWarfare

ответ

0

Как уже отмечался в некоторых комментариях, вы, вероятно, речь идете о Numpy массивов.

В этом случае достаточно просто маскировать значение, которое вы хотите избежать:

import numpy as np 
from scipy.stats import mode 

array = np.array([[0, 0, 3, 2, 0, 0], 
       [5, 2, 1, 2, 6, 7], 
       [0, 0, 2, 4, 0, 0]]) 
flat_non_zero = array[np.nonzero(array)] 
mode(flat_non_zero) 

Который возвращает (array([2]), array([ 4.])) означает значение, появляющееся больше всего 2, и он появляется в 4 раза (см doc для больше информации). Поэтому, если вы хотите получить только 2, вам просто нужно получить первый индекс возвращаемого значения в режиме: mode(flat_non_zero)[0][0]

EDIT: если вы хотите отфильтровать другое значение x из массива вместо нуля, вы можете использовать array[array != x]

3

collections.Counter Попробуйте:

import numpy as np 
from collections import Counter 

a = np.array(
    [[0, 0, 3, 2, 0, 0], 
    [5, 2, 1, 2, 6, 7], 
    [0, 0, 2, 4, 0, 0]] 
) 

ctr = Counter(a.ravel()) 
second_most_common_value, its_frequency = ctr.most_common(2)[1] 
0
original_list = [1, 2, 3, 1, 2, 5, 6, 7, 8] #original list 
noDuplicates = list(set(t))     #creates a list of all the unique numbers of the original list 

most_common = [noDuplicates[0], original_list.count(noDuplicates[0])] #initializes most_most common to 
                     #the first value and count so we have something to start with 


for number in noDuplicates:   #loops through the unique numbers 
    if number != 0:     #makes sure that we do not check 0 
     count = original_list.count(number)  #checks how many times that unique number appears in the original list 
     if count > most_common[1] #if the count is greater than the most_common count 
      most_common = [number, count] #resets most_common to the current number and count 


print(str(most_common[0]) + " is listed " + str(most_common[1]) + "times!") 

Это перебирает свой список и находит наиболее часто используемые номера и печатает его с числом вхождений в вашем первоначальном списке.

Смежные вопросы