搜尋陣列項目
如果要單純用 Python 搜尋一堆數據裡的特定資料,往往要使用迴圈的方式一層層查找,如果透過 NumPy,則可以使用現成的搜尋方法搜尋特定的項目,大幅提高程式的處理效能,這篇教學將會介紹 NumPy 裡搜尋陣列項目的做法。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
搜尋陣列項目的方法
NumPy 有下列幾種搜尋陣列項目的方法:
方法 | 參數 | 說明 |
---|---|---|
numpy.where() | 判斷式,arr,val | 根據判斷式找出索引值,回傳索引值的陣列,如果有設定 arr 和 val 會根據 arr 和 val 回傳新的陣列。 |
numpy.nonzero() | arr | 取得內容「非 0」的項目索引值,並將索引值回傳為為新陣列。 |
numpy.count_nonzero() | arr | 計算陣列中「非 0」項目的數量。 |
numpy.extract() | 條件 arr, 目標 arr | 根據條件陣列中的 True 或 False 項目索引值,取出目標 arr 對應的項目為新陣列。 |
numpy.where()
numpy.where() 會根據判斷式找出索引值,回傳索引值的陣列,如果有設定 arr 和 val 會根據 arr 和 val 回傳新的陣列。,下方的例子會找出 a 陣列中項目為 b 的索引值。
import numpy as np
a = np.array(['a','b','c','d','a','b','c'])
b = np.where(a=='b')
print(b) # (array([1, 5]),) b 位在 1 和 5 的位置
下方的例子,會找出二維陣列 a 裡,數值大於 3 的項目索引值。
import numpy as np
a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.where(a>3)
print(b) # (array([0, 1, 1, 1, 1]), array([3, 0, 1, 2, 3]))
# 對應 (0,3) -> 4
# 對應 (1,0) -> 5
# 對應 (1,1) -> 6
# 對應 (1,2) -> 7
# 對應 (1,3) -> 8
下方的例子,會找出二維陣列 a 裡,數值大於 3 的項目索引值,並將其套用於 b 陣列,b 陣列會顯示對應索引值為 True 的項目,索引為 False 的項目則以 0 顯示。
import numpy as np
a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.array([['a','a','a','a'],['b','b','b','b']])
c = np.where(a>3,b,0)
print(c)
'''
[['0' '0' '0' 'a']
['b' 'b' 'b' 'b']]
'''
numpy.nonzero()
numpy.nonzero() 會取得內容「非 0」的項目索引值,並將索引值回傳為為新陣列。下方的例子會找出一維陣列中數值為 1 的索引值。
import numpy as np
a = np.array([1,0,1,0,1,0,1,0])
b = np.nonzero(a)
print(b) # array([0, 2, 4, 6]),)
下方的例子會找出二維陣列中數值為 1 的索引值。
import numpy as np
a = np.array([[1,0,1,0],[1,0,1,0]])
b = np.nonzero(a)
print(b) # (array([0, 0, 1, 1]), array([0, 2, 0, 2]))
# 對應 (0, 0) (0, 2) (1, 0) (1, 2)
numpy.count_nonzero()
numpy.count_nonzero() 會計算陣列中「非 0」項目的數量。
import numpy as np
a = np.array([1,0,1,0,1,0,1,0])
b = np.count_nonzero(a)
print(b) # 4
numpy.extract()
numpy.extract() 會根據條件陣列中的 True 或 False 項目索引值,取出目標 arr 對應的項目為新陣列。
import numpy as np
a = np.array([1,0,1,0,1,0,1,0])
b = np.array(['a','b','c','d','e','f','g','h'])
c = np.extract(a,b) # 預設 1 為 True,0 為 False
print(c) # ['a' 'c' 'e' 'g']
d = np.extract(a==0,b) # 加入判斷條件,0 變成 True
print(d)) # ['b' 'd' 'f' 'h']
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~