介紹如何在 Python 中使用 NumPy 模組的 unique
函數列出陣列中所有不重複的元素,並統計每個元素出現的次數。
在 Python 中我們可以使用 numpy
模組的 unique
函數列出串列(list)中所有不重複的元素:
import numpy # 原始數字資料 a = [3, 4, 0, 1, 3, 0, 0, 1, 4, 4] # 列出不重複數字 print("不重複數字:", numpy.unique(a))
不重複數字: [0 1 3 4]
對於由字串所構成的串列也可以用 unique
函數來處理:
# 原始資料 b = ["A", "B", "A", "C", "B", "C", "A", "A"] # 列出不重複元素 print("不重複元素:", numpy.unique(b))
不重複元素: ['A' 'B' 'C']
如果想要統計串列中每一個數字出現的次數,可以在呼叫 unique
函數時將 return_counts
參數設定為 True
:
# 原始數字資料 a = [3, 4, 0, 1, 3, 0, 0, 1, 4, 4] # 不重複數字與出現次數 unique, counts = numpy.unique(a, return_counts=True) print("各數字出現次數:", dict(zip(unique, counts)))
各數字出現次數: {0: 3, 1: 2, 3: 2, 4: 3}
對於字串所構成的串列也適用:
# 原始資料 b = ["A", "B", "A", "C", "B", "C", "A", "A"] # 不重複元素與出現次數 unique, counts = numpy.unique(b, return_counts=True) print("各元素出現次數:", dict(zip(unique, counts)))
各元素出現次數: {'A': 4, 'B': 2, 'C': 2}
如果只需要最後建立的字典(dict)結構,可以用更簡潔的寫法:
# 原始數字資料 a = [3, 4, 0, 1, 3, 0, 0, 1, 4, 4] # 不重複數字與出現次數 print("各數字出現次數:", dict(zip(*numpy.unique(a, return_counts=True))))
各數字出現次數: {0: 3, 1: 2, 3: 2, 4: 3}
unique
在處理二維以上的陣列資料時,預設會將其轉換為一維來處理(flatten):
# 二維陣列 a = numpy.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]]) # 列出不重複數字 print("不重複數字:", numpy.unique(a))
不重複數字: [0 1 2 3 4]
若要列出不重複的子陣列,可以將 axis
參數設定為要進行篩選操作的維度:
# 列出不重複的子陣列 print("不重複的列:", numpy.unique(a, axis=0))
不重複的子陣列: [[1 0 0] [2 3 4]]
亦可計算每一個不重複列的出現次數:
# 二維陣列 a = numpy.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]]) # 不重複列與出現次數 unique, counts = numpy.unique(a, axis=0, return_counts=True) for row, cnt in zip(unique, counts): print("{}: {}".format(row, cnt))
[1 0 0]: 2 [2 3 4]: 1
collections
列出不重複元素除了 numpy
模組的 unique
函數之外,亦可使用 collections
來列出不重複元素:
import collections # 以 collections 列出不重複元素 a = [3, 4, 0, 1, 3, 0, 0, 1, 4, 4] print(collections.Counter(a))
Counter({4: 3, 0: 3, 3: 2, 1: 2})
# 以 collections 列出不重複元素 b = ["A", "B", "A", "C", "B", "C", "A", "A"] print(collections.Counter(b))
Counter({'A': 4, 'B': 2, 'C': 2})
參考資料:StackOverflow