从一个数组中查找不同数组中某个元素范围内的元素

时间:2019-04-26 11:07:48

标签: python arrays numpy

我有两个不等长的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中时。因此,来自108的值为a的元素与来自109的值为b的元素相匹配。结果输出应为:

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 个答案:

答案 0 :(得分:3)

这是获取a_prime的一种方法,其中与阈值无关,将a中与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)