我有一个非常大的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 []是一个1D numpy 10值长数组,我搜索silo_arrays):
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个。有没有人想过如何通过某种排序或结构变化 加速此搜索过程? 感谢您的支持:)
答案 0 :(得分:1)
在数据优化方面,您经常处理权衡取舍而不是整体加速。
因此,在使用以下解决方案之前,请确保您了解随之而来的限制,即增加写入时间。
一种流行的算法是实现二进制搜索。如果您不熟悉这个概念:
给定一个有序的数字列表 L 和一个数字 v ,你必须检查v in L
。您可以这样做,将列表分成两半,然后将这两个间隔的中间值与您的值 v 进行比较。假设升序,您将根据以下规则选择 I 区间:if v < L[middleindex]: I = lower_half else I = upper_half
然后重复继续搜索。这样可以将搜索空间降至最低。
为了在项目中使用二进制搜索,您需要在将数组插入数组时对其进行排序。要比较的值将是您的数组元素的降序。这样你可能会提高搜索速度。
使用二进制搜索的好处在于,在两种情况下(最差和最佳情况),它都执行相同的操作,即 O(log n)。这使它非常可靠。
借口格式化,我在移动设备上。