python-通过与另一个列表的元素进行比较来查找列表中元素的索引的最快方法

时间:2018-07-10 19:24:29

标签: python numpy list-comprehension

使用numpy,我正在使用以下算法在单独的列表中查找列表元素的索引

    IndexList = np.zeros(len(x))

    for i in range(len(x)):

        positionx = np.where(cx == x[i])
        positiony = np.where(cy == y[i])

        Index = np.intersect1d(positionx, positiony)

        IndexList[i] = Index

这本身是非常快的,但是我想知道是否有更快的方法来达到相同的目的。有没有比numpy更好的模块了?还是其他一些numpy函数可以使此过程更快?可以使用pythonic方法或理解方法使这种代码片段更快吗?

最终,我想查看包含cx和cy的矩阵是否具有与两个列表中的当前x y对匹配的特定(x,y)坐标对。

示例:cx,cy x,y是一维numpy数组

    cx cy        x  y 
    45 30        20 10
    20 10        19 13
    44 53      
    19 13

在这种情况下,indexList = [1, 3]

1 个答案:

答案 0 :(得分:2)

检查cxcy中的哪个对等于xy中的对

mask = (cx == x[:, None]) & (cy == y[:, None])

要获取cxcy中存在的xy中元素的索引,请使用

np.vstack(np.where(mask))[1]
# outputs: array([1, 3], dtype=int64)

获取存在于xy中的cxcy中的元素的索引

np.vstack(np.where(mask))[0]
# outputs: array([0, 1], dtype=int64)

基准代码:

%timeit op(cx, cy, x, y)
44.6 µs ± 616 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit hal(cx, cy, x, y)
8.57 µs ± 90.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

使用示例数据将速度提高5.2倍

# test methods
def op(cx, cy, x, y):
    IndexList = np.zeros(len(x))
    for i in range(len(x)):
        px = np.where(cx == x[i])
        py = np.where(cy == y[i])
        Index = np.intersect1d(px, py)
        IndexList[i] = Index
    return IndexList

def hal(cx, cy, x, y):
    mask = ( cx == x[:, None] ) & ( cy == y[:, None] )
    return np.vstack(np.where(mask))[1]