【问题标题】:Python - Most efficient way to sort array for searching in itPython - 对数组进行排序以在其中搜索的最有效方法
【发布时间】:2017-07-06 21:48:36
【问题描述】:

我有一个非常大的 numpy 数组,看起来像这样(前 5 个条目):

[[ 1.    0.01  0.02  0.6   0.01  0.5   0.01  0.5   0.5   0.5 ]
 [ 0.5   0.01  0.01  0.6   0.01  0.5   0.5   0.5   0.5   0.6 ]
 [ 0.6   0.01  0.5   0.5   0.5   0.5   0.7   0.01  0.01  0.  ]
 [ 0.01  0.5   0.8   0.02  0.02  0.81  0.01  0.77  0.02  0.01]
 [ 0.5   0.02  0.5   0.    0.5   0.5   0.01  0.6   0.01  0.  ]]

在这个数组中搜索来寻找同样有 10 个值长的特定序列。 所以我在没有特殊规则之后存储传入的序列,只是 0 1 2 3 ... 并且我搜索这个数组。这是我的搜索方法(silo_arrays[][] 是上面的数组,array_pattern[] 是我搜索 silo_arrays 的一维 numpy 10 值长数组)

   new_pattern=True
   for z in range(0, self.silo_arrays_c):
    eq_rate = 0
    for y in range(0, self.length):
        if(self.silo_arrays[z][y] != array_pattern[y]):
            break
        else:
            eq_rate += 1

    if(eq_rate == self.length):
     new_pattern = False
     break

如果 silo_arrays 大约有 1585 个条目长,这大约需要 0.006257 秒。有没有人知道如何通过某种排序结构变化加速这个搜索过程? 感谢您的支持:)

【问题讨论】:

  • np.where((silo_arrays==array_pattern).all(1))?

标签: python arrays numpy search data-structures


【解决方案1】:

当谈到数据优化时,您通常会处理权衡,而不是整体加速。

因此,在使用以下解决方案之前,请确保您了解随之而来的限制,即增加的写入时间。

一种流行的算法是实现二分搜索。如果您不熟悉这个概念:

给定一个有序的数字列表L和一个数字v,你必须检查v in L。您可以这样做,方法是将列表分成两半,然后将这两个区间的中间值与您的值 v 进行比较。假设升序,您将根据以下规则选择一个区间 Iif v < L[middleindex]: I = lower_half else I = upper_half 然后您通过重复继续搜索。这样,您可以将搜索空间减少到最低限度。

为了在您的项目中使用二进制搜索,您需要在将数组插入数组时对其进行排序。要比较的值将是降序排列的数组元素。这样,您可能会提高搜索速度。

使用二分搜索的好处是,在两种情况下(最坏情况和最好情况)它的性能相同,即 O(log n)。这使得它非常可靠。

对不起格式化,我在手机上。

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 2021-06-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多