13 搜寻数组的元素

7 阅读3分钟

如果使用 python 搜索一堆数据里面特别的数据,往往就需要使用循环的方式一层层查找,如果通过 Numpy,则可以使用现成的方法搜寻特别的元素,大幅提高程序的处理效率,下面将介绍 Numpy 里面搜索数组元素的方法

搜寻数组元素的方法

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 返回新的数组

函数调用格式返回结果类型核心用途
np.where(condition)索引元组(如二维数组返回 (行索引数组,列索引数组))查找满足条件的元素「位置」
np.where(condition, x, y)condition同形状的数组(元素来自 xy按条件批量「替换 / 选择值」

下面的例子会找出 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 元素的索引值,取出目标数组对应元素的新数组

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' '