搜索数组项目
如果要单纯用 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']
微信扫码关注
抖音扫码关注