查找与值列表匹配的行的有效方法

时间:2017-11-10 10:26:10

标签: python numpy

这个问题类似于this one,但在我的案例中我无法找到适应它的方法。

我有一个非常大的Nx3整数矩阵。我需要找到与整数列表匹配的行列表。最终目标是过滤矩阵以删除包含其中一个值的行。

现在,我能提出的最好的方法是在我的整数列表中使用for循环,并在numpy.logical_and.reduce找到行。我相信必须有一种更有效的方式,而不必使用较低级别的语言。

import numpy as np
matrix = np.random.randint(0,100000,(50000, 3))
values_to_find = np.random.randint(0,100000,10000)
matches = np.ones(len(matrix), bool)
for value in values_to_find:
    matches = matches & np.logical_and.reduce(matrix != value, axis=1)
new_matrix = matrix[matches]

什么是更有效和更优雅的方式?

2 个答案:

答案 0 :(得分:2)

一种方法是使用np.in1d在所有行中获取匹配的掩码,然后查找具有任何一个匹配的行,然后获取其余行 -

matrix[~np.in1d(matrix, values_to_find).reshape(matrix.shape).any(1)]

答案 1 :(得分:2)

使用np.isin的另一种方法,即

matrix[~np.isin(matrix, values_to_find).any(1)]