在numpy数组中需要找到所有最接近给定常量的值的索引。
背景是数字信号处理。数组保存滤波器的幅度函数(
迄今为止,我想出了以下的方法,其中我查看序列与常量之间差异的符号变化。但是,这仅适用于在问题点处单调递增或递减的序列。有时它也会错过1。
我找到的类似问题只返回第一个或第二个索引,以下是:
查找最接近值的第二个索引
在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]
我想知道是否有更好的解决方案。这仅适用于1D实数浮点数组,而且在我的情况下计算效率的要求不是很高。
作为一个数值例子,以下代码应返回[8, 41]
。这里为了简单起见,我用半波替换了滤波器幅度响应。
f=np.sin(np.linspace(0, np.pi))
findvalue(f, 0.5)
我找到的类似问题只返回第一个或第二个索引,以下是:
查找最接近值的第二个索引
在numpy数组中查找最接近的值
r + np.ones_like(r)
而不是简单地写r + 1
? - Martin Scharrerr = np.where(np.diff(np.sign(seq - val)) != 0)[0]
,然后r + 1
就可以工作了。 - Aguysort
更改为unique
以删除重复项,并使四舍五入变成可选项。def argvalue(seq, val, intidx=True): 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)) if intidx: idx = np.round(idx).astype(int) idx = np.unique(idx) return idx
- Martin Scharrer