有没有找到合适指数的好方法?

时间:2017-09-01 15:23:10

标签: python-3.x

我正在寻找任何包或模块,以便比我的编码更快地找到索引。

如果有一个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中更快找到?

2 个答案:

答案 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行!