【问题标题】:How to find the minimum difference between numbers in a numpy array如何找到numpy数组中数字之间的最小差异
【发布时间】:2021-06-04 21:07:06
【问题描述】:

我有一个 numpy 数组,其中包含作为实验输出的样本。样本都是整数,但我认为这并不重要。有些值在数组中出现了几次,而有些值出现了数百次 - 数组可以包含 10,000 个样本。

虽然这些值看起来是随机的,但它们有一个最小间距。我的意思是没有两个值比例如 27 更接近。所以你可能会在数组中的某个地方看到 50 个值 999,027 的样本,你可能会看到 999,054 的 120 个样本,但你不会看到一个 999,036 样本数组中任意位置的值。我需要检查阵列并确定最小间距是多少,但如果可能的话非常快。您可以将其称为“最近的样本值距离”。我不必检查每个案例,就像您想象的那样,只需检查几个样本,只要它们的值接近,就可以很好地猜测最小差异是多少。

有没有人有一个聪明的算法(使用 Python)可以相当快地找到任何样本之间最近的最小距离?正如我所说,数组可以很大,每秒要检查几十个。

抱歉,这是一个如此奇怪的问题。我希望我已经设法解释得足够好。

【问题讨论】:

    标签: python arrays numpy spacing minimum


    【解决方案1】:

    您可以对数组的唯一元素进行排序,然后找到连续数字之间的最短距离:

    def find_min_distance(lst):
        sorted_lst = sorted(set(lst))
        return min(n2 - n1 for n1, n2 in zip(sorted_lst, sorted_lst[1:]))
    

    例如:

    >>> lst = [6, 8, 1, 4, 9, 4, 8]
    >>> find_min_distance(lst)
    1
    

    这种方法的复杂性是 O(nlogn),其中 n 是原始数组中的元素数。没有比这更好的复杂性了,除非您事先知道您的数字落在哪个范围内。

    【讨论】:

      【解决方案2】:

      由于您有 numpy 数组,因此 numpy 应该会加快速度,尽管可能有更有效的实现:

      import numpy as np
      from timeit import timeit
      
      #Riccardo Bucco
      def f1(lst):
          sorted_lst = sorted(set(lst))
          return min(n2 - n1 for n1, n2 in zip(sorted_lst, sorted_lst[1:]))
      
      #numpy solution
      def f2(arr):
          b = np.diff(np.sort(arr))
          return b[b>0].min()
      
      ntime = 100 #number of test runs
      nxd = 5000    #array length
      nmax = 1000000
      
      print(timeit(lambda: f1(np.random.randint(1, nmax, nxd)), number=ntime))
      #0.347
      
      print(timeit(lambda: f2(np.random.randint(1, nmax, nxd)), number=ntime))
      #0.0327
          
      
      ntime = 10 #number of test runs
      nxd = 5000000    #array length
      nmax = 100000000
      
      print(timeit(lambda: f1(np.random.randint(1, nmax, nxd)), number=ntime))
      #62.54
      
      print(timeit(lambda: f2(np.random.randint(1, nmax, nxd)), number=ntime))
      #5.46
      

      【讨论】:

      • 啊绝妙的概念里卡多。这是思考如何获得答案和最小化处理时间的好方法。所以,逻辑是按值对列表进行排序,然后找到相邻排序样本之间的最小差异。很高兴看到 numpy 以这种方式有效地工作。我没有说,但是当样本值较低时,样本更有可能表现出最小间隙,这使得使用采样来加速这一过程变得更加容易。谢谢。
      • 对不起,我的意思是感谢 T 先生和 Riccardo 的概念和执行 - 我的错误。无论如何,T先生;我现在已经在 numpy 版本中使用了它,它工作得很好,谢谢。与我想出的相比,numpy 的速度非常快。此外,我认为我也可以轻松地加快速度 - 例如,不要查看整个数组,但使用样本可能会在实践中对我拥有的数据起作用。会向有类似问题的任何人推荐这种方法。
      猜你喜欢
      • 2015-10-08
      • 2013-04-03
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多