提高在列表中查找项目索引的速度

时间:2019-03-29 23:55:31

标签: python numpy multidimensional-array vectorization numpy-ndarray

我正在尝试加快编写的程序的速度,在导入cProfile之后,我发现一个函数会占用大量的计算时间。

就是这样,它在列表中找到一个numpy.ndarray:

    def locate(arr, l ):
        for i in range(len(l)):
            if np.all(l[i] == arr):
                return i
        return -1

由于无法排序列表,因此我看不到任何方法可以避免扫描整个列表。我已经阅读了一些有关矢量化的文章,我想知道是否可以将其应用于此处,或者是否还有其他方法可以加快速度?

谢谢

4 个答案:

答案 0 :(得分:2)

您可能无法避免走列表,但可以加快比较速度:

设置示例:

L  = list(np.floor(np.outer(*2*(np.linspace(1,10,1000),))))
arr = L[537]

直接参考的方法:

import itertools as it

next(it.chain((i for i, a in enumerate(L) if np.all(arr==a)), (-1,)))
# 537
timeit(lambda: next(it.chain((i for i, a in enumerate(L) if np.all(arr==a)), (-1,))), number=100)
# 0.27100146701559424

方法1:使用np.array_equal(慢一点)

next(it.chain((i for i, a in enumerate(L) if np.array_equal(arr, a)), (-1,)))
# 537
timeit(lambda: next(it.chain((i for i, a in enumerate(L) if np.array_equal(arr, a)), (-1,))), number=100)
# 0.2992244770284742

方法2:使用无效视图(更快)

arr_v = arr.reshape(-1).view(f'V{arr.itemsize*arr.size}')

next(it.chain((i for i, a in enumerate(L) if arr_v==a.reshape(-1).view(f'V{a.itemsize*a.size}')), (-1,)))
# 537
timeit(lambda: next(it.chain((i for i, a in enumerate(L) if arr_v==a.reshape(-1).view(f'V{a.itemsize*a.size}')), (-1,))), number=100)
# 0.11853155982680619

答案 1 :(得分:1)

有一个名为index()的内置python函数,您可以在其中插入字符串作为值并在列表中找到其索引,以使用它。

答案 2 :(得分:0)

您是否正在寻找np.where

temp_list=np.array(temp_list)
np.where(temp_list==5)
(array([1, 3, 6, 8]),)

答案 3 :(得分:0)