行明智地包含在numpy中

时间:2018-01-28 17:09:09

标签: numpy

我想知道在python numpy中检查行明智包含的最佳方法是什么?

假设我们有一个向量V = [1,2,3,4]和一个矩阵M = [[2,3,4],[3,5,6],[4,1,3],[ 5,4,2](M中的行数等于V的长度)。在执行row wise后,我应该得到(False,False,True,True),因为1不在[2,3,4]中,2不在[3,5,6]中,3在[4,1]中,[3]和4在[5,4,2]

在python numpy中执行此操作的最佳方法是什么?

实际上,我不想使用for循环。这显然可行,而不是最好的方法。我自己提出这个想法做一个减法,然后计算结果中的零数,这比使用for循环要快得多。但是,我想知道是否有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:3)

您正在寻找的是in运营商。例如1 in [1,2,3]返回True 因此,将vm的值视为numpy数组,如下所示:

import numpy as np
v = np.array([1,2,3,4])
m = np.array([np.array([2,3,4]), np.array([3,5,6]), np.array([4,1,3]), np.array([5,4,2])])    
# Checking row wise contain
result = [(v[i] in m[i]) for i in range(len(v))]

结果是:

>>> [(v[i] in m[i]) for i in range(len(v))]
[False, False, True, True]

Divakar指出的另一个解决方案是使用

>>> (m==v[:,None]).any(1)
array([False, False,  True,  True], dtype=bool)

然而,做一些粗略的时间检查:

>>> start_time=time.time(); (m==v[:,None]).any(1); print(time.time()-start_time)
array([False, False,  True,  True], dtype=bool)
0.000586032867432
>>> start_time=time.time(); [(v[i] in m[i]) for i in range(len(v))]; print(time.time()-start_time)
[False, False, True, True]
7.20024108887e-05

最初的解决方案似乎更快。