【问题标题】:Finding elements from one array within a certain range of elements of a different array [duplicate]在不同数组的特定元素范围内从一个数组中查找元素[重复]
【发布时间】:2019-04-26 11:07:47
【问题描述】:

我有两个长度不等的 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

但是,对于较大的数组长度,这将非常耗时。实现相同结果的快速且更 Pythonic 的方法是什么?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    这是获取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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2019-12-18
      • 1970-01-01
      相关资源
      最近更新 更多