在不同数组的某个元素范围内查找另一个数组的元素

3

我有两个长度不同的NumPy数组:

a = numpy.array([108, 637, 1172, 1304, 2260, 2809])
b = numpy.array([109, 634, 2254, 2814])

我想要缩短 a 数组,使得每个数组中对应元素相似。匹配的标准是当 b 数组的元素在范围内时:element a - 50 < element b < element a + 50。因此,a 数组中值为 108 的元素与 b 数组中值为 109 的元素匹配。输出结果如下:

a_prime = numpy.array([108, 637, 2260, 2809])
b_prime = numpy.array([109, 634, 2254, 2814])

我可以通过双重 for 循环配置来实现这一点:
a_prime = numpy.zeros(b.shape[0], dtype = int)
b_prime = numpy.copy(b)

for idx, element_b in enumerate(b):
  for element_a in a:
    if (element_a - 50) < element_b < (element_a + 50):
      a_prime[idx] = element_a

然而,对于大数组长度,这将非常耗时。有什么更快、更符合Python风格的方法来达到同样的结果呢?

1个回答

3
以下是翻译的结果:

这里有一种方法可以获得 a_prime,其中在 b 中给定值的最接近值被设置为相同索引,在此过程中不考虑阈值,因为毕竟你要找到最接近的值:

a_prime = a[np.abs(np.subtract.outer(b,a)).argmin(1)]
# array([ 108,  637, 2260, 2809])

使用np.substract.outer函数可以计算出b中每个值与a中每个值的差异,取绝对值即可得到以下结果:

x = np.abs(np.subtract.outer(b,a))
print(x)
array([[   1,  528, 1063, 1195, 2151, 2700],
       [ 526,    3,  538,  670, 1626, 2175],
       [2146, 1617, 1082,  950,    6,  555],
       [2706, 2177, 1642, 1510,  554,    5]])

现在我们只需要每行的argmin值,并使用它来索引a

x.argmin(1)
# array([0, 1, 4, 5], dtype=int64)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接