在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]
。为了简单起见,我用半波代替了滤波器的幅度响应。在
我发现的类似问题如下,但它们只返回第一个或第二个索引:
Find the second closest index to value
Find nearest value in numpy array
下面的函数将返回一个分数索引,显示该值被交叉时的近似值:
逻辑:找出seq-val的符号在哪里变化。取转换上方和下方的一个指数,然后加上这个索引的值实际上等于这个值。在
如果您想要一个整数索引,只需使用np.圆形. 你也可以选择np.楼层或者np.ceil公司将索引四舍五入到您的喜好。在
^{pr2}$我想你有两个选择。一种是对形状做一些假设,并寻找}之间的差的零交叉点(就像@ColonelFazackerley在{a2}中所做的那样)。另一种方法是说明要将该值考虑得足够接近哪个相对公差。在
seq
和你的{在后一种情况下,您可以使用
numpy.isclose
:示例:
^{pr2}$这有一个缺点,它依赖于
rtol
的值。设置得太大(本例中为0.1
),您将得到接近交叉点的多个值,设置得太低,则没有任何值。在再解释一下
^{pr2}$相关问题 更多 >
编程相关推荐