Python 如何选择另一个矩阵中的一个矩阵向量

Python 如何选择另一个矩阵中的一个矩阵向量,python,pandas,numpy,Python,Pandas,Numpy,我有两个矩阵: a = [[1,3,4],[2,5,3],[2,4,6],[6,5,3]] b = [[2,4,5],[2,4,6],[1,3,4]] 我想在b中选择[2,4,6],[1,3,4],这是在a中 因为a和b都很大 for v in b: if v in a: 它很贵 有谁能告诉我最好的方法吗?对于二维矩阵,你想要的是一个等价物。我不久前写过这样一个函数 def in2d(arr1, arr2): """Generalisation of numpy.in1

我有两个矩阵:

a = [[1,3,4],[2,5,3],[2,4,6],[6,5,3]] 
b = [[2,4,5],[2,4,6],[1,3,4]] 
我想在b中选择[2,4,6],[1,3,4],这是在a中

因为a和b都很大

for v in b:
    if  v in a:
它很贵


有谁能告诉我最好的方法吗?

对于二维矩阵,你想要的是一个等价物。我不久前写过这样一个函数

def in2d(arr1, arr2):
    """Generalisation of numpy.in1d to 2D arrays"""

    assert arr1.dtype == arr2.dtype

    arr1_view = np.ascontiguousarray(arr1).view(np.dtype((np.void,
         arr1.dtype.itemsize * arr1.shape[1])))
    arr2_view = np.ascontiguousarray(arr2).view(np.dtype((np.void,
         arr2.dtype.itemsize * arr2.shape[1])))
    intersected = np.in1d(arr1_view, arr2_view)
    return intersected.view(np.bool).reshape(-1)
可以找到有关其工作原理的说明。 您可以像这样使用函数

In [56]: a = np.array([[1,3,4],[2,5,3],[2,4,6],[6,5,3]])
In [57]: b = np.array([[2,4,5],[2,4,6],[1,3,4]])

In [58]: in2d(b,a)
Out[58]: array([False,  True,  True], dtype=bool) 
它返回一个布尔数组,其中b的元素在a中。反之亦然

In [59]: in2d(a,b)
Out[59]: array([ True, False,  True, False], dtype=bool)
使用此布尔数组对索引进行索引可以提供所需的内容

In [60]: a[in2d(a,b),:]
Out[60]: 
array([[1, 3, 4],
       [2, 4, 6]])
请注意,下面发布的解决方案是不正确的,并且与您认为的不一样,因为如果a中的v搜索所有嵌套的数组/列表元素。因此,下面的比较是不公平的,但是,请考虑

def for_loop_and_compare(a,b):
    return np.array([v for v in b if v in a])
时间呢

In [61]: a=np.random.randint(0,100,(10000,3))
In [62]: b=np.random.randint(0,100,(1000,3))
In [63]: %timeit for_loop_and_compare(a,b)
10 loops, best of 3: 79 ms per loop
In [64]: %timeit in2d(a,b)
100 loops, best of 3: 3.7 ms per loop

那么,a和b到底是什么:Python列表、numpy向量还是numpy矩阵?有三种不同的数据类型,对于较大的a和b,转换可能比计算更昂贵。b是否明显小于a?如果是这样的话,在b上这样的迭代可能是最好的选择。测试的另一个途径是设置。另一个变量是子列表的相对大小。对这个问题的变体进行了一些时间测试即使假设a和b已经是numpy数组,您的函数所需的时间也比OP的普通解决方案长4倍。从嵌套列表到数组的转换会增加更多开销。对于大型numpy数组,此函数比OP的解决方案效率更高。我在包含5000个sic元素的数组中尝试了此函数,预转化为numpy。使用视图将问题转化为INAD或unique可以处理的问题是这些唯一行或行交叉点问题的常见答案。但是相对速度在很大程度上取决于问题的大小,因此很难概括出哪个更好。查看一维代码以了解如何解决问题是一个好主意。数组结构不是为快速搜索而设计的。还请注意,如果a:中的v不符合人们可能认为的功能,请使用OP的数据