gpt4 book ai didi

python - 在 Python 中查找最接近的值并返回数组的索引

转载 作者:IT老高 更新时间:2023-10-28 21:53:06 55 4
gpt4 key购买 nike

我找到了这篇文章:Python: finding an element in an array

它是关于通过匹配值返回数组的索引。

另一方面,我想做的事情相似但不同。我想找到目标值的最接近值。例如,我正在寻找 4.2,但我知道数组中没有 4.2,但我想返回值 4.1 而不是 4.4 的索引。

最快的方法是什么?

我正在考虑用旧的方式来做这件事,就像我以前用 Matlab 做的那样,它使用数组 A,我想从中获取索引减去目标值并取其绝对值,然后选择分钟。像这样的东西:-

[~,idx] = min(abs(A - target))

这是 Matlab 代码,但我是 Python 的新手,所以我在想,有没有一种在 Python 中快速的方法?

非常感谢您的帮助!

最佳答案

这类似于使用 bisect_left,但它允许您传入一个目标数组

def find_closest(A, target):
#A must be sorted
idx = A.searchsorted(target)
idx = np.clip(idx, 1, len(A)-1)
left = A[idx-1]
right = A[idx]
idx -= target - left < right - target
return idx

一些解释:

首先是一般情况:idx = A.searchsorted(target)返回每个 target 的索引这样 target介于 A[index - 1] 之间和 A[index] .我称这些为 leftright所以我们知道left < target <= right . target - left < right - targetTrue (或 1)当目标更接近 left 时和 False (或 0)当目标更接近 right 时.

现在是特殊情况:当 target小于 A 的所有元素, idx = 0 . idx = np.clip(idx, 1, len(A)-1)替换 idx 的所有值< 1 与 1,所以 idx=1 .在这种情况下 left = A[0] , right = A[1]我们知道target <= left <= right .因此我们知道target - left <= 0right - target >= 0所以target - left < right - targetTrue除非target == left == rightidx - True = 0 .

如果target 还有另一种特殊情况大于 A 的所有元素, 在那种情况下 idx = A.searchsorted(target)np.clip(idx, 1, len(A)-1)
替换 len(A)len(A) - 1所以idx=len(A) -1target - left < right - target结束False所以 idx 返回 len(A) -1 .我会让你自己处理逻辑。

例如:

In [163]: A = np.arange(0, 20.)

In [164]: target = np.array([-2, 100., 2., 2.4, 2.5, 2.6])

In [165]: find_closest(A, target)
Out[165]: array([ 0, 19, 2, 2, 3, 3])

关于python - 在 Python 中查找最接近的值并返回数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8914491/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com