python查找數組中出現次數最多的元素


方法1-np.argmax(np.bincount())

看一個例子

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

#[1 1 2 1 3 1 1]
#4

這里用到了兩個函數,np.argmax和np.bincount,第一個很常見,就是返回數組中最大值對應的下標,np.bincount可以通過上面的例子理解:首先找到數組最大值max,然后返回0~max的各個數字出現的次數,在上例中,0出現了1次,1出現了1次,2出現了2次...以此類推。

為什么這兩個函數合起來可以找到出現次數最多的元素呢?因為np.bincount返回的數組中的下標對應的就是原數組的元素值,如上例中np.argmax找到np.bincount返回的數組中的最大值3(原數組中4出現了3次),其對應的下標4正是原數組中的元素4,如此就可以找到數組中出現次數最多的元素。

但是這種方法有一個缺陷,即bincount只能統計0~max出現的次數,所以這種方法僅適用於非負數組

方法2-Counter().most_common(1)[0][0]

看一個例子

from collections import Counter
array = [0,1,2,2,3,4,4,4,5,6]
print(Counter(array))
print(Counter(array).most_common(1)[0][0])

#Counter({4: 3, 2: 2, 0: 1, 1: 1, 3: 1, 5: 1, 6: 1})
#4

Counter用來對數組中元素出現次數進行統計,然后通過most_common函數找到出現次數最多的元素。這種方法對於數組就沒有過多限制,甚至是各種類型元素混合的數組也可以

from collections import Counter
array = [0,1,2,2,3,4,4,4,5,6,'aswd']
print(Counter(array))
print(Counter(array).most_common(1)[0][0])

#Counter({4: 3, 2: 2, 0: 1, 1: 1, 3: 1, 5: 1, 6: 1, 'aswd': 1})
#4

關於most_common函數可以通過下面的例子加深理解:

方法三

自己數各個元素出現的次數然后找到出現次數最多的元素

appear_times = {}
for label in [1,1,2,3,4,5,5,5]:
    if label in appear_times:
      appear_times[label] += 1
    else:
      appear_times[label] = 1

most_common = max(appear_times, key=lambda x: appear_times[x])
print(appear_times)
print(most_common)

#{1: 2, 2: 1, 3: 1, 4: 1, 5: 3}
#5

這里需要注意的是appear_times是一個列表,用max求最大值默認情況返回value值(出現次數)最大的key值(元素),而不是value值,這里max函數中的參數key(和前面說的key不是一個東西)是指定尋找最大值的方式,在我們這個問題這里其實不需要這個參數,不過為了便於理解我還是寫上了,對max函數key參數更深入的理解可以參考下面的例子:

print(max('ahecsc', 'bfsacg', 'aaaaaz', key=lambda x: x[0]))
print(max('ahecsc', 'bfsacg', 'aaaaaz', key=lambda x: x[3]))
print(max('ahecsc', 'bfsacg', 'aaaaaz', key=lambda x: x[5]))

#bfsacg
#ahecsc
#aaaaaz

同樣的數據,key參數不同,結果不同,第一種情況是以數據的第一個位置元素的大小關系排序,並返回排序結果最大的數據('b'>'a'>'a',返回'b'所在的'bfsacg');第二種情況類似('c'>'a'>'a',返回'c'所在的'ahecsc');第三種情況('z'>'g'>'c',返回'z'所在的'aaaaaz')

目前我只知道這三種方法,如果有大佬知道更多好用的辦法,歡迎留言🙏:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM