有没有一种方法可以通过快速将其转换为numpy矩阵在python中搜索列表?

时间:2019-05-12 22:37:29

标签: python arrays performance numpy

我试图通过遍历数组的行并检查其中的值是否与条件匹配来搜索python 2D数组。一个例子在这里:

def searchList(list, v0, v1, v2, v3):
 for r in range(len(list)):
    if (list[r][0] == v0) & (list[r][1] == v1) & (list[r][2] == v2) & (list[r][3] == v3):
        return r

 return None

但是,与其他语言相比,这在python中相当慢。

现在主要的问题是此列表正在动态增长,并且可能具有1000或更多行。

当我上网搜索如何使其更快时,我发现将列表移至numpy矩阵并使用np.where()可以做到这一点。

def searchList(list, v0, v1, v2, v3):
    tmpQ = np.array(list)
    locList = np.where((tmpQ[:,0] == v0) & (tmpQ[:,1] == v1) & (tmpQ[:,2] == v2) & (tmpQ[:,3] == v3))
    if locList[0].size == 0:
        return None
    else:
        return locList[0][0]

现在的问题是,将python 2D数组转换为numpy矩阵是因为此操作还需要大量时间。

我的另一种选择是摆脱python 2D数组,而仅使用numpy矩阵,但这也行不通,因为矩阵不断增长,连接操作需要很长时间。

有什么办法可以快速做到这一点?

我知道是什么原因导致使用cProfile并运行代码花费最多的时间。

2 个答案:

答案 0 :(得分:0)

这取决于您的数据形状,您可以尝试以下操作:

def searchList(mylist, v0, v1, v2, v3):
    try:
        row_num = mylist.index([v0, v1, v2, v3])
    except ValueError:
        return None
    return row_num 


m = [[1,2,3,4], [5,6,7,8], [3,2,8,7], [1,3,6,9]]
print(searchList(m, 3, 2, 8, 7))

输出:

2

答案 1 :(得分:0)

您似乎在列表中搜索4个连续的条目。 例如,您可能希望找到列表中彼此相邻出现的数字1, 5, 6,7

被称为“ single pattern string matching algorithm

您的代码很慢,因为您已实施了针对该问题的强力解决方案。 蛮力算法需要与n*m成比例的时间,其中n是列表的长度,m是连续子列表的长度(对于您的示例,m = 4)

我建议您使用其他人的代码,而不是自己编写代码(重新发明轮子)。我没有尝试以下操作,但它似乎是Knuthe-Morris-Pratt Algorithm的python实现:

python implementation on github