我正在寻找任何包或模块,以便比我的编码更快地找到索引。
如果有一个numpy数组,比如
a = numpy.array([1,2,3,4,5,6])
所以这些是[0] = 1,a [1] = 2,a [2] = 3,a [3] = 4,a [4] = 5,a [5] = 6。在这种情况下,我想在3.5左右找到两个索引(就在之前和之后) 那么,这个解决方案是[2]和[3],对吗?
好吧,我采取了这种方式
for i in range(len(a) - 1):
difference1 = 3.5 - a[i]
difference2 = 3.5 - a[i + 1]
if difference1 * difference2 < 0:
print(i)
所以我可以找到[2]。我知道[3]比我所拥有的所有东西都大3.5。 但这只是一个例子。我处理更多的大数据,所以需要很多时间。是否有任何工具(模块或包)在python中更快找到?
答案 0 :(得分:0)
您希望在列表中使用两个连续值。 这是一个经典问题,您可以像这样简化:
for prev_a, next_a in zip(a[:-1], a[1:]):
difference1 = 3.5 - prev_a
difference2 = 3.5 - next_a
if difference1 * difference2 < 0:
print("diffrence found")
如果您确实需要索引,可以使用enumerate
:
for index, (prev_a, next_a) in enumerate(zip(a[:-1], a[1:])):
difference1 = 3.5 - prev_a
difference2 = 3.5 - next_a
if difference1 * difference2 < 0:
print index
如果您想要更快,可以先计算产品,然后比较:
diff_list = [3.5 - value for value in a]
for index, (prev_diff, next_diff) in enumerate(zip(diff_list[:-1], diff_list[1:])):
if prev_diff * next_diff < 0:
print(index)
答案 1 :(得分:0)
这是一个使用numpy的解决方案。我假设您的数组是从您的示例中排序的。
我模拟了这个版本,并且在10M元素阵列上,该方法的执行速度比原始版本快10倍。我也没有尝试将每个numpy活动合并在一起(如果你愿意的话,你可以在一条长行中这样做),以便清楚。
您的示例的具体答案:
a = numpy.array([1,2,3,4,5,6])
print numpy.where(numpy.sort(numpy.concatenate((a,[3.5])))==3.5)[0][0] - 1
更多解释的更长示例:
import time
import numpy
a = numpy.array([1,2,3,4,5,6])
f = 3.5
#Replacing with a larger range of values to search for timing test
a = numpy.arange(10000000)
f = 500000.5
print "starting new version"
start = time.time()
b = numpy.concatenate((a,[f]))
c = numpy.sort(b)
d = numpy.where(c==f)[0][0] - 1
print d
end = time.time()
print end-start
print "do it in one unreadable line"
start = time.time()
print numpy.where(numpy.sort(numpy.concatenate((a,[f])))==f)[0][0] - 1
end = time.time()
print end-start
print "starting original version"
start = time.time()
for i in range(len(a) - 1):
difference1 = f - a[i]
difference2 = f - a[i + 1]
if difference1 * difference2 < 0:
print i
end = time.time()
print end-start
编辑:将较长的示例放在第二位,这样看起来我建议的解决方案看起来不是30行!