查找最接近值的numpy数组的所有索引

2024-09-28 19:08:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在numpy数组中,需要最接近给定常量的所有值的索引。 以数字信号处理为背景。该数组包含滤波器的幅度函数(np.abs(np.fft.rfft(h))),并且在幅值为0.5或另一种情况下为0时搜索特定频率(=索引)。 大多数情况下,所讨论的值不完全包含在序列中。关闭值的索引应该在这个中找到。在

到目前为止,我想出了下面的方法,在这个方法中,我观察序列和常量之间差异符号的变化。然而,这只适用于在所讨论的点单调递增或递减的序列。有时也会被1关。在

def findvalue(seq, value):
    diffseq = seq - value
    signseq = np.sign(diffseq)
    signseq[signseq == 0] = 1
    return np.where(np.diff(signseq))[0]

我想知道有没有更好的解决办法。它只适用于一维实浮体阵列,对计算效率的要求不高。在

作为一个数值示例,下面的代码应该返回[8, 41]。为了简单起见,我用半波代替了滤波器的幅度响应。在

^{pr2}$

我发现的类似问题如下,但它们只返回第一个或第二个索引:
Find the second closest index to value
Find nearest value in numpy array


Tags: 方法numpyvaluenp情况序列数字数组
3条回答

下面的函数将返回一个分数索引,显示该值被交叉时的近似值:

def FindValueIndex(seq, val):
    r = np.where(np.diff(np.sign(seq - val)) != 0)
    idx = r + (val - seq[r]) / (seq[r + np.ones_like(r)] - seq[r])
    idx = np.append(idx, np.where(seq == val))
    idx = np.sort(idx)
    return idx

逻辑:找出seq-val的符号在哪里变化。取转换上方和下方的一个指数,然后加上这个索引的值实际上等于这个值。在

如果您想要一个整数索引,只需使用np.圆形. 你也可以选择np.楼层或者np.ceil公司将索引四舍五入到您的喜好。在

^{pr2}$

我想你有两个选择。一种是对形状做一些假设,并寻找seq和你的{}之间的差的零交叉点(就像@ColonelFazackerley在{a2}中所做的那样)。另一种方法是说明要将该值考虑得足够接近哪个相对公差。在

在后一种情况下,您可以使用numpy.isclose

import numpy as np

def findvalue(seq, val, rtol=0.05):    # value that works for your example
    return np.where(np.isclose(seq, val, rtol=rtol))[0]

示例:

^{pr2}$

这有一个缺点,它依赖于rtol的值。设置得太大(本例中为0.1),您将得到接近交叉点的多个值,设置得太低,则没有任何值。在

def findvalue(seq, value):
    diffseq = seq - value
    signseq = np.sign(diffseq)
    zero_crossings = signseq[0:-2] != signseq[1:-1]
    indices = np.where(zero_crossings)[0]
    for i, v in enumerate(indices):
        if abs(seq[v + 1] - value) < abs(seq[v] - value):
            indices[i] = v + 1
    return indices

再解释一下

^{pr2}$

相关问题 更多 >