Python 获取数组中等于给定值大小的值
引言
可能很多小伙伴看到这个标题会觉得很绕口,甚至可能会觉得这属于脱裤子放屁,多此一举,但是这里请大家耐心往下看,这篇文章将介绍一个在实际应用中比较常见的数据处理的示例。
正文
基础方法
比如,这里我们有一个 numpy
数组。
[1 2 3 4 5 6 7 8 9 0]
我们想要获取到它中间等于 5 的值。那么该怎么操作呢?
方法1
遍历整个数组进行查找并打印
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
num = 5
for element in arr:
if element == num:
print(element)
"""
result:
5
"""
当然,如果加上 enumerate 我们也可以顺带得到其对应的索引值。如下:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
num = 5
for index, element in enumerate(arr):
if element == num:
print(index, element)
"""
result:
4 5
"""
虽然我们得到了结果,但是显然这并不 Pythonic。
方法2------使用 np.where() 函数
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
num = 5
result = arr[np.where(arr == num)]
print(result)
"""
result:
[5]
"""
相比于之前,我们得到的是一个数组,而不再是一个数罢了。至于获取对应的索引值,只需要打印 np.where(arr == num) 即可,如下:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
num = 5
index = np.where(arr == num)
print(index)
"""
result:
(array([4], dtype=int64),)
"""
但是,这仍旧不是最简单的方式
方法3------数组操作
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
num = 5
result = arr[arr == num]
print(result)
"""
result:
[5]
"""
可以看到,我们也得到了想要的结果,看到这里,感觉还是在扯,别着急,看一个下面的例子。
示例1
在现实的例子中,往往我们的数组元素本身并不是一些整数,而是小数,比如:
[1.4465446, 2.5445116, 3.654451, 4.156154964, 5.516515, 6.1264847,
7.126448, 8.1264984, 9.16154654, 0.54881651]
这时,我们想要获取到它们谁更加近似等于我们给定的数据 5 该怎么办呢?
import numpy as np
arr = np.array([1.4465446, 2.5445116, 3.654451, 4.156154964, 5.416515, 6.1264847, 7.126448, 8.1264984, 9.16154654, 0.54881651])
num = 5
result = arr[np.round(arr, 0) == num]
print(result)
"""
result:
[5.416515]
"""
到这里,是不是体会到了标题真正的含义了?有人也许会说,你这里如果是 5.5 几几几就找不到值了,然而这种担心是多余的,因为实际中,往往会存在很多个接近 5 的小数,总会有值的,如果没有,那说明确实也没有数字接近 5。
示例 2
更经典的一个示例是,如果我们有两组一一对应的数据,比如:
1 1.4465446
2 2.5445116
3 3.654451
4 4.156154964
5 5.416515
6 5.123546
7 5.461682
8 5.1565446
9 5.364588979
10 5.7845151
我们想要获取后面一列数字中接近 5 的值所对应的第一列数字的值,但是我们发现后面一列数字中有很多值满足条件,那么如何找出前一列中唯一对应的数字呢?
import numpy as np
index = np.arange(1, 11)
arr = np.array([1.4465446, 2.5445116, 3.654451, 4.156154964, 5.416515, 5.123546, 5.461682, 5.1565446, 5.364588979, 5.7845151])
num = 5
result = index[int(np.round(np.mean(arr[np.round(arr, 0) == num]), 0))]
print(result)
"""
result:
6
"""
至此,我们完全说清楚了这个问题。
注意,本文所给出的方法适用于数据在给定数值附近波动的情况,如果数据本身在给定数值附近是单调的,应该采用 Python 寻找一个一维数组中最接近某个值的元素 一文中给出的方法。
如果大家觉得有用,就请点个赞吧~